在 Pyspark 中将多行组合为 JSON 对象

Posted

技术标签:

【中文标题】在 Pyspark 中将多行组合为 JSON 对象【英文标题】:Combine multiple rows as JSON object in Pyspark 【发布时间】:2021-03-03 18:50:57 【问题描述】:

我对 pyspark 很陌生,想对数据框执行以下操作。对于具有相似 id 的行,我需要在 JSON 块中组合关联的列。如下例所示,输出应为 1 个 JSON 块,其中包含 secId、名称和路径列。

id secId names path bin
1 12 [“area” : “en”, “value” : “name1” , “area” : “sp”, “value” : “name2”] [abc, xyz] bin1
1 13 [“area” : “en”, “value” : “name3” , “area” : “sp”, “value” : “name4”] [klm, nop] bin1

需要输出为

id bin json
1 bin1 [“secId” : 12,“names” : [“area” : “en”, “value” : “name1” , “area” : “sp”, “value” : “name2”],“path” : [abc, xyz],“secId” : 13,“names” : [“area” : “en”, “value” : “name3” , “area” : “sp”, “value” : “name4”],“path” : [klm, mno]]

如果有人能提供一些关于这样做的指导方针,那将会很有帮助。

谢谢

【问题讨论】:

请将示例数据以文本而非图像的形式发布。 当然,也用文字更新了问题 查看this question 示例 感谢您的链接。我试图做类似的事情,但是当我做 df.show() 时,我得到:调用 o3426.showString 时发生错误。 :org.apache.spark.SparkException:作业因阶段失败而中止:阶段 143.0 中的任务 3 失败 1 次,最近一次失败:阶段 143.0 中丢失任务 3.0(TID 647,本地主机,执行程序驱动程序):java.lang.AssertionError : 断言失败你知道如何解决这个问题吗? 【参考方案1】:

    Spark 'struct' 函数用于创建 Scala 映射结构(键 -> 值)。

    Spark 'to_json' 函数创建一个 json 结构。

    对 id 和 bin 列进行 groupby 并使用 collect_list 函数创建您想要的结果。

    import pyspark.sql.functions as F
    df.withColumn('json', F.to_json(F.struct("secId", "names", "path"))).groupby('id', 'bin').agg(F.collect_list('json')).show(5, False)
    

【讨论】:

以上是关于在 Pyspark 中将多行组合为 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Grafana 中将多个数据系列组合为相同的值

在 Python 中将 3 个单独的 numpy 数组组合为 RGB 图像

在 Pyspark 中将结构转换为数组

将 JSON 多行文件加载到 pyspark 数据框中

从 pyspark 中的多行文件中读取 JSON 文件

如何在 PySpark 中将字符串转换为字典 (JSON) 的 ArrayType