我想基于一行中的值将RDD分为多个RDD。行中的值是预先知道的,并且本质上是固定的。
例如
source_rdd = sc.parallelize([('a',1),('a',2),('a',3),('b',4),('b',5),('b',6)])
应分为两个RDD,其中一个仅包含a
,另一个仅包含b
作为键
groupByKey
方法,并且对分组的RDD执行了collect()
操作后成功完成了该操作,由于内存限制,我在生产中无法做到这一点a_rdd, b_rdd = source_rdd.keyBy(lambda row: row[0]).groupByKey().collect()
a_rdd = source_rdd.filter(lambda row: row[0] == 'a')
b_rdd = source_rdd.filter(lambda row: row[0] == 'b')
这可以进一步优化吗,在生产中无法容纳内存的数据的最佳方式是什么?
用法:这些RDD将转换为不同的数据框(每个键一个),每个数据框具有不同的架构,并作为输出存储在S3中。
注意:我希望实施pyspark
。我已经阅读了很多堆栈溢出的答案和博客,但是仍然找不到对我有用的东西。
我已经看到了标记为重复的问题,我已经在问题中提到过。我问了这个问题,因为提供的解决方案似乎不是最优化的方法,并且已经使用了3年。
答案 0 :(得分:0)
您也可以使用toDF
。 Aslo,a_rdd
和b_rdd
在您的代码中不是rdd
,因为它们已被收集!
df = source_rdd.keyBy(lambda row: row[0]).groupByKey()
a_rdd = df.filter(lambda row: row[0] == 'a')
b_rdd = df.filter(lambda row: row[0] == 'b')