如何使用 Pyspark 将一个 rdd 映射到另一个?
Posted
技术标签:
【中文标题】如何使用 Pyspark 将一个 rdd 映射到另一个?【英文标题】:How to Map one rdd to another with Pyspark? 【发布时间】:2018-03-19 15:49:31 【问题描述】:我有rdd1
有labels(0,1,4)
和另一个rdd2
有文字。我想将rdd1
与rdd2
映射,这样rdd1
的row1
与rdd2
的row1
映射等等。
我试过了:
rdd2.join(rdd1.map(lambda x: (x[0], x[0:])))
它给了我错误:
RDD is empty.
有人可以在这里指导我吗? 示例输出:rdd1- labels & rdd2-Text
rdd1 rdd2
0 i hate painting i have white paint all over my hands.
0 Bawww I need a haircut No1 could fit me in before work tonight. Sigh.
4 I had a great day
1 what is life.
4 He sings so good
1 i need to go to sleep ....goodnight
Sample output
【问题讨论】:
0,1,4 在同一行吗? rdd2 的值是多少?你的预期输出是什么? rdd2 有文字。我想将预测标签从 rdd1 映射到 rdd2 对应地从 row1。不同的行有不同的标签。 0,1,4是三个类别 您能否通过提供示例 rdd2 和预期输出来进一步澄清一下? 以下是我正在寻找的输出: rdd1 rdd2 0 我讨厌绘画我的手上全是白漆 1 什么是生活? 0 我需要一部新手机.....我也要去睡觉了!明天尤威学校。 4 我度过了非常美好的一天 0 Blah,我想该睡觉了。早上看到我的朋友们回到俄亥俄州 1 我要睡觉了....晚安 @RahulAnand 你能edit你的问题并将示例输出作为格式化代码发布吗?很难解读为评论。 【参考方案1】:如果你有rdd1
作为
val rdd1 = sc.parallelize(List(0,0,4,1,4,1))
和rdd2
一样
val rdd2 = sc.parallelize(List("i hate painting i have white paint all over my hands.",
"Bawww I need a haircut No1 could fit me in before work tonight. Sigh.",
"I had a great day",
"what is life.",
"He sings so good",
"i need to go to sleep ....goodnight"))
我想将 rdd1 与 rdd2 映射,这样 rdd1 的第 1 行与 rdd2 的第 1 行映射,依此类推。
使用 zip 功能
一个简单的zip
函数应该可以满足你的要求
rdd1.zip(rdd2)
这会给你输出
(0,i hate painting i have white paint all over my hands.)
(0,Bawww I need a haircut No1 could fit me in before work tonight. Sigh.)
(4,I had a great day)
(1,what is life.)
(4,He sings so good)
(1,i need to go to sleep ....goodnight)
zipWithIndex 并加入
这种方法会得到与上面使用zip
解释的相同的输出(而且这种方法也很昂贵)
rdd1.zipWithIndex().map(_.swap).join(rdd2.zipWithIndex().map(_.swap)).map(_._2)
希望回答对你有帮助
【讨论】:
以上是关于如何使用 Pyspark 将一个 rdd 映射到另一个?的主要内容,如果未能解决你的问题,请参考以下文章
映射 dict(来自 rdd)以递归方式更改 Python/PySpark 中的列名
在 PySpark 中使用 rdd.map 解压和编码字符串