从多行生成一行到 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的主要内容,如果未能解决你的问题,请参考以下文章