【问题标题】:Convert spark Rdd column to rows in Pyspark [duplicate]将 spark Rdd 列转换为 Pyspark 中的行 [重复]
【发布时间】: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


    【解决方案1】:

    如果你想工作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]|
    #+---+------------+
    

    【讨论】:

    • 平面地图函数创建多个列表,我不希望输出为列表格式。我可以同时在两列上使用分解功能吗?我得到了另一列包含单词的分数。所以我必须将两列一起分解
    • @vish 我不明白。 flatMap() 不应创建多个列表。我认为你最好的办法是用你的实际用例编辑你的问题(或提出一个新问题)。如果没有看到输入和所需的输出,很难给出答案但是您可能正在寻找rdd.flatMap(lambda x: [(x['ID'], w, s) for w, s in zip(x["Words"], x["Scores"])]).collect()
    猜你喜欢
    • 2020-12-06
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多