【发布时间】:2018-07-24 09:53:11
【问题描述】:
我有一个形式为 Row(id,Words) 的 spark Rdd 其中 words 包含单词列表。我想将此列表转换为单列。 输入
ID Words
1 [w1,w2,w3]
2 [w3,w4]
我想把它转换成输出格式
ID Word
1 w1
1 w2
1 w3
2 w3
2 w4
【问题讨论】:
标签: python apache-spark pyspark
我有一个形式为 Row(id,Words) 的 spark Rdd 其中 words 包含单词列表。我想将此列表转换为单列。 输入
ID Words
1 [w1,w2,w3]
2 [w3,w4]
我想把它转换成输出格式
ID Word
1 w1
1 w2
1 w3
2 w3
2 w4
【问题讨论】:
标签: python apache-spark pyspark
如果你想工作rdd,你需要使用flatMap():
rdd.flatMap(lambda x: [(x['ID'], w) for w in x["Words"]]).collect()
#[(1, u'w1'), (1, u'w2'), (1, u'w3'), (2, u'w3'), (2, u'w4')]
但是,如果您愿意使用 DataFrames (recommended),您可以使用 pyspark.sql.functions.explode:
import pyspark.sql.functions as f
df = rdd.toDF()
df.select('ID', f.explode("Words").alias("Word")).show()
#+---+----+
#| ID|Word|
#+---+----+
#| 1| w1|
#| 1| w2|
#| 1| w3|
#| 2| w3|
#| 2| w4|
#+---+----+
或者更好的是,一起跳过rdd,直接创建一个DataFrame:
data = [
(1, ['w1','w2','w3']),
(2, ['w3','w4'])
]
df = sqlCtx.createDataFrame(data, ["ID", "Words"])
df.show()
#+---+------------+
#| ID| Words|
#+---+------------+
#| 1|[w1, w2, w3]|
#| 2| [w3, w4]|
#+---+------------+
【讨论】:
flatMap() 不应创建多个列表。我认为你最好的办法是用你的实际用例编辑你的问题(或提出一个新问题)。如果没有看到输入和所需的输出,很难给出答案但是您可能正在寻找rdd.flatMap(lambda x: [(x['ID'], w, s) for w, s in zip(x["Words"], x["Scores"])]).collect()