我在使用spark时遇到了一些问题,以便过滤大数据文件。
在CSV文件中有一个NxM维度矩阵(不包括标题和其他标记),如果过滤函数为真,我需要过滤每一列,得到行数。
首先,我使用databricks包加载文件,然后继续映射并过滤列。当我使用一个小的测试用例时,它可以工作,但在实际情况下,它永远不会结束。
据我所知,为了加速执行spark,我需要获取分区,因此每个执行程序可以并行执行任务。考虑到这一点,我认为最好的方案是为每个执行程序(M个分区)分配一列,因此没有人必须在内存中加载完整的csv。这可能吗?
让它更简单,想象一个NxM矩阵满0和1的15k x 5k。我想计算每列中1的数量。
1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 1
作为databricks数据框,我可以像这样过滤一列:
df.rdd.map(lambda r: r.C0).filter(lambda x: x == str(1)).count()这仍将加载所有数据,但永远不会在我的群集中完成。
答案 0 :(得分:0)
如果使用整数模式加载数据,则可以使用总和,它比字符串比较更有效。
sc.textFile(yourfile).map(lambda line: [int(x) for x in line.split(";")])