根据值将RDD拆分为多个RDD,而无需执行`collect()`和`filter()`

时间:2018-11-26 07:43:59

标签: apache-spark pyspark rdd amazon-emr

我想基于一行中的值将RDD分为多个RDD。行中的值是预先知道的,并且本质上是固定的。

例如

source_rdd = sc.parallelize([('a',1),('a',2),('a',3),('b',4),('b',5),('b',6)])

应分为两个RDD,其中一个仅包含a,另一个仅包含b作为键

  1. 我尝试了groupByKey方法,并且对分组的RDD执行了collect()操作后成功完成了该操作,由于内存限制,我在生产中无法做到这一点
a_rdd, b_rdd = source_rdd.keyBy(lambda row: row[0]).groupByKey().collect()
  1. 当前的实现方式是应用多个过滤器操作来获取每个RDD
a_rdd = source_rdd.filter(lambda row: row[0] == 'a')
b_rdd = source_rdd.filter(lambda row: row[0] == 'b')

这可以进一步优化吗,在生产中无法容纳内存的数据的最佳方式是什么?

用法:这些RD​​D将转换为不同的数据框(每个键一个),每个数据框具有不同的架构,并作为输出存储在S3中。

注意:我希望实施pyspark。我已经阅读了很多堆栈溢出的答案和博客,但是仍然找不到对我有用的东西。

我已经看到了标记为重复的问题,我已经在问题中提到过。我问了这个问题,因为提供的解决方案似乎不是最优化的方法,并且已经使用了3年。

1 个答案:

答案 0 :(得分:0)

您也可以使用toDF。 Aslo,a_rddb_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')