从多行生成一行到 RDD

Posted

技术标签:

【中文标题】从多行生成一行到 RDD【英文标题】:Generate one rows from many rows into an RDD 【发布时间】:2016-11-30 16:43:24 【问题描述】:

我需要将 rdd 转换为两行,而不是 rdd 转换为一行。示例:

rdd1=a
     b

我需要:

rdd2=(a,b)

如何在 pyspark 中执行此步骤? 这个问题可能很愚蠢,但我是新来的。 “更新” 这是在 rdd2 和 rdd3 之间执行笛卡尔运算,从 rdd1 开始。喜欢:

rdd3:(k,l)
     (c,g)
     (f,x)

我想要这个输出:

rddOut:[(a,b),(k,l)]
       [(a,b),(c,g)]
       [(a,b),(f,x)]

提前致谢

【问题讨论】:

【参考方案1】:

更新我的答案:

initRDD = sc.parallelize(list('aeiou')).map(lambda x: (x, ord(x))).collect()

ssc = StreamingContext(sc, batchDuration=3)

lines = ssc.socketTextStream('localhost', 9999)
items = lines.flatMap(lambda x: x.split())
counts = items.countByValue().map(lambda x: ([x] + initRDD))

它看起来像广播而不是笛卡尔。

【讨论】:

【参考方案2】:

您能详细解释一下您的需求吗?拥有单行的 RDD 并不是一个好主意,因为您会失去所有并行性。

如果你想通过key来收集数据,你可以将RDD转换成pairs(key和value)的RDD。然后,您可以执行 reduceByKey 以便通过将 reduce 函数作为列表连接来通过键将所有内容收集到列表中。

【讨论】:

问题是我必须对两个相同的 rdds 执行测量距离(在两者之间执行笛卡尔),但结果太大了,因为我正在使用大规模数据集。所以想法是取 rdd1 的第一行,对所有 rdd2(与 rdd1 相同)执行笛卡尔运算,然后发出一个输出文件。去掉rdd1的第一行,取新的第一行,用rdd2进行笛卡尔运算,生成第二个文件等【参考方案3】:

如果我对您的问题的理解是正确的,那么使用 flatMap 将为您提供所需的输出。

【讨论】:

以上是关于从多行生成一行到 RDD的主要内容,如果未能解决你的问题,请参考以下文章

一行变多行的代码生成器(非常好用)

利用jquery.ajax在jsp页面动态生成table,可以增加修改,并支持一行和多行删除

pyspark RDD 将一行扩展为多行

04 RDD编程练习

使用选择插入多行

04 RDD编程练习