Python 将spark Rdd列转换为Pyspark中的行

Python 将spark Rdd列转换为Pyspark中的行,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个spark Rdd,它的形式是Row(id,Words) 其中单词包含单词列表。我想将此列表转换为一列。 输入 我想把它转换成输出格式 ID Word 1 w1 1 w2 1 w3 2 w3 2 w4 如果要使用rdd,则需要使用flatMap(): rdd.flatMap(lambda x:[(x['ID'],w)表示x[“Words”]]中的w)。collect() #[(1,u'w1’,(1,u'w2’,(1,u'w3’,(2,u'w3’,(2,u'w4’)

我有一个spark Rdd,它的形式是Row(id,Words) 其中单词包含单词列表。我想将此列表转换为一列。 输入

我想把它转换成输出格式

ID  Word
1   w1
1   w2
1   w3
2   w3
2   w4

如果要使用
rdd
,则需要使用
flatMap()

rdd.flatMap(lambda x:[(x['ID'],w)表示x[“Words”]]中的w)。collect()
#[(1,u'w1’,(1,u'w2’,(1,u'w3’,(2,u'w3’,(2,u'w4’)]
但是,如果您愿意使用DataFrames(),则可以使用
pyspark.sql.functions.explode

导入pyspark.sql.f函数
df=rdd.toDF()
df.select('ID',f.explode(“Words”).别名(“Word”).show()
#+---+----+
#|ID |字|
#+---+----+
#|1 | w1|
#|1 | w2|
#|1 | w3|
#|2 | w3|
#|2 | w4|
#+---+----+
或者更好的方法是,跳过所有的
rdd
,直接创建一个数据帧:

数据=[
(1、['w1'、'w2'、'w3']),
(2,['w3','w4'])
]
df=sqlCtx.createDataFrame(数据,[“ID”,“Words”])
df.show()
#+---+------------+
#|ID|字|
#+---+------------+
#|1 |[w1,w2,w3]|
#|2 |[w3,w4]|
#+---+------------+

如果您想使用
rdd
,您需要使用
flatMap()

rdd.flatMap(lambda x:[(x['ID'],w)表示x[“Words”]]中的w)。collect()
#[(1,u'w1’,(1,u'w2’,(1,u'w3’,(2,u'w3’,(2,u'w4’)]
但是,如果您愿意使用DataFrames(),则可以使用
pyspark.sql.functions.explode

导入pyspark.sql.f函数
df=rdd.toDF()
df.select('ID',f.explode(“Words”).别名(“Word”).show()
#+---+----+
#|ID |字|
#+---+----+
#|1 | w1|
#|1 | w2|
#|1 | w3|
#|2 | w3|
#|2 | w4|
#+---+----+
或者更好的方法是,跳过所有的
rdd
,直接创建一个数据帧:

数据=[
(1、['w1'、'w2'、'w3']),
(2,['w3','w4'])
]
df=sqlCtx.createDataFrame(数据,[“ID”,“Words”])
df.show()
#+---+------------+
#|ID|字|
#+---+------------+
#|1 |[w1,w2,w3]|
#|2 |[w3,w4]|
#+---+------------+

Flat map函数创建多个列表,我不希望输出为列表格式。我可以同时在两列上使用分解函数吗?我得到了另一列,其中包含大量单词。所以我必须分解这两列together@vish我不明白
flatMap()
不应创建多个列表。我认为对你来说最好的事情是用你的实际用例编辑你的问题(或者问一个新问题)。在没有看到输入和所需输出的情况下,很难给出答案,但您可能正在寻找
rdd.flatMap(lambda x:[(x['ID'],w,s)表示w,s在zip中(x[“Words”],x[“Scores”])))。collect()
flatMap函数创建多个列表,我不希望输出为列表格式。我可以同时在两列上使用分解函数吗?我得到了另一列,其中包含大量单词。所以我必须分解这两列together@vish我不明白
flatMap()
不应创建多个列表。我认为对你来说最好的事情是用你的实际用例编辑你的问题(或者问一个新问题)。在没有看到输入和所需输出的情况下,很难给出答案,但您可能正在寻找
rdd.flatMap(lambda x:[(x['ID'],w,s)表示w,s在zip中(x[“Words”],x[“Scores”]))。collect()
ID  Word
1   w1
1   w2
1   w3
2   w3
2   w4