将 Spark Rdd 列转换为 Pyspark 中的行

vis*_*ish 0 python apache-spark pyspark

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

ID  Words
1   [w1,w2,w3]
2   [w3,w4]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为输出格式

ID  Word
1   w1
1   w2
1   w3
2   w3
2   w4
Run Code Online (Sandbox Code Playgroud)

pau*_*ult 5

如果你想工作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')]
Run Code Online (Sandbox Code Playgroud)

但是,如果您愿意使用 DataFrame(推荐),您可以使用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|
#+---+----+
Run Code Online (Sandbox Code Playgroud)

或者更好的是,跳过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]|
#+---+------------+
Run Code Online (Sandbox Code Playgroud)