python - 如何对大型数据集进行分组

标签 python data-structures hadoop apache-pig

我有一个包含两列的简单文本文件,都是整数

1 5
1 12
2 5
2 341
2 12

等等..

我需要按第二个值对数据集进行分组, 这样输出将是。

5 1 2
12 1 2
341 2

现在的问题是文件很大,大约 34 Gb 在大小方面,我尝试编写一个 python 脚本将它们分组到一个字典中,并将值作为一个整数数组,但仍然需要太长时间。 (我想分配 array('i') 并在 append 上扩展它们会花费大量时间。

我现在计划编写一个 pig 脚本,我计划在一个伪分布式 hadoop 机器(一个 Amazon EC3 高内存大型实例)上运行。

data = load 'Net.txt';
gdata = Group data by $1; // I know it will lead to 5 (1,5) (2,5) but thats okay for this snippet
store gdata into 'res.txt';

我想知道是否有更简单的方法。

更新: 将这么大的文件保存在内存中是不可能的,在 python 解决方案的情况下,我计划在第一次运行中进行 4 次运行,仅在下一次运行中考虑从 1 到 1000 万的第二个 col 值,考虑 1000 万到 2000 万等等。但事实证明这真的很慢。

pig/hadoop 解决方案很有趣,因为它将所有内容都保存在磁盘上[嗯,大部分]。

为了更好地理解此数据集包含约 4500 万推特用户的连接信息,文件中的格式意味着第二个数字给出的用户 ID 在第一个数字之后。

我用过的解决方案:

class AdjDict(dict):
    """
     A special Dictionary Class to hold adjecancy list
    """
    def __missing__(self, key):
        """
        Missing is changed such that when a key is not found an integer array is initialized
        """
        self.__setitem__(key,array.array('i'))
        return self[key]

Adj= AdjDict()

for line in file("net.txt"):
    entry =  line.strip().split('\t')
    node = int(entry[1])
    follower = int(entry[0])
    if node < 10 ** 6:
        Adj[node].append(follower)

# Code for writting Adj matrix to the file:

最佳答案

假设您每行大约有 17 个字符(为了简化数学计算我随机选择了一个数字),您在此文件中有大约 20 亿条记录。除非您在 64 位系统上使用大量物理内存运行,否则您将试图将所有这些保存在内存中的单个 dict 中,从而将您的页面文件弄死。这只是将其作为数据结构读入 - 假设在构建此结构后,您计划实际一些事情。

有了如此简单的数据格式,我认为您最好用 C 而不是 Python 来做一些事情。破解这些数据应该不难,而且每个值的开销也会少得多。至少,仅容纳 20 亿个 4 字节整数将是 8 Gb(除非您可以对当前列为 1 和 2 的值的可能范围做出一些简化假设 - 如果它们适合一个字节或一个短整数,那么您可以使用更小的 int 变量,对于这种大小的数据集来说,这将是值得的。

关于python - 如何对大型数据集进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3403800/

相关文章:

algorithm - logN 中的搜索、插入、删除和删除最后操作

java - 了解使用递归调用的二叉搜索树 (BST) 删除实现

hadoop - 修改cloudera manager端口7180为80

hadoop - yarn 公平调度程序无法平均分配资源

python - 使用图像处理检测近水平线

python - 使用句点选择/切片多索引数据帧时间序列会导致错误?

python - 将列表列表组合成字典的简洁方法?

python - 在 tfp 中训练变分贝叶斯神经网络时,如何分别可视化损失中不同项的演化?

algorithm - 卡在B树的形成算法中,具体算法是什么?

c# - 如何从Azure Blob存储中的Hadoop AvroContainer删除记录?