json的Pyspark问题具有字符串和数组值的字段

Posted

技术标签:

【中文标题】json的Pyspark问题具有字符串和数组值的字段【英文标题】:Pyspark issue with json having a field with string as well as array values 【发布时间】:2021-11-14 17:36:34 【问题描述】:

我有一个 Spark 集群,并且必须将 JSON 数据索引到 Elastic Search (ES)。有一列如下(仅两个样本):

"ADDRESS": "PO box 1234, Lahore"
"ADDRESS": [ "PO box 5678, Karachi", "new city Lahore"]

上列的问题是,在某些记录中,它显示为字符串,而在其他一些情况下,它显示为字符串数组。我在ES中测试过上面的案例,在ES中没有问题,它可以索引两种情况而没有问题(如果直接索引的话)。

我编写了一个 Spark (pyspark) 作业来读取大型 JSON,然后将其插入 ES。在 Spark 模式中,它将此字段显示为字符串而不是数组。现在,当我将数据插入 ES 时,我得到以下响应

"ADDRESS": "PO box 1234, Lahore",
"ADDRESS": "[\"PO box 5678, Karachi\", \"new city Lahore\"]",

它不是显示为数组数据,而是显示为字符串。现在,问题出在哪里?我正在阅读 JSON 如下:

df = spark.read.option("multiline", "false").json(data_path)

更新 在数据框中看到的示例输入数据

【问题讨论】:

您的期望是什么?你想让你的数据框df 将该列作为字符串还是数组? 我希望所有数据都作为字符串数组 【参考方案1】:

我的想法是将 string "PO box 1234, Lahore" 变成 string ["PO box 1234, Lahore"],然后将它们全部转换成 Array of String,如下所示:

import pyspark.sql.functions as F

(df
    .withColumn('ADDRESS2', F
        .when(~F.col('ADDRESS').startswith('['), F.concat(F.lit('["'), F.col('ADDRESS'), F.lit('"]')))
        .otherwise(F.col('ADDRESS'))
    )
    .withColumn('ADDRESS2', F.from_json('ADDRESS2', T.ArrayType(T.StringType())))
    .show(10, False)
)

# Output
# +------------------------------------------+---------------------------------------+
# |ADDRESS                                   |ADDRESS2                               |
# +------------------------------------------+---------------------------------------+
# |PO box 1234, Lahore                       |[PO box 1234, Lahore]                  |
# |["PO box 5678, Karachi","new city Lahore"]|[PO box 5678, Karachi, new city Lahore]|
# +------------------------------------------+---------------------------------------+


# root
#  |-- ADDRESS: string (nullable = true)
#  |-- ADDRESS2: array (nullable = true)
#  |    |-- element: string (containsNull = true)

【讨论】:

谢谢,我只需要根据价值观来做。输入字符串只是数据框中的值 嗯,我不明白?可以多分享一点吗? 是的,让我更新问题 问题已更新 谢谢,您显示的输入也是我所期望的。如果您看到我发布的代码,它会从您的原始输入中读取,即字符串(ADDRESS 列)。然后我创建一个名为ADDRESS2 的新列(不一定,您可以根据需要覆盖ADDRESS 列),转换后,您可以在底部看到架构说ADDRESS2 is Array of String

以上是关于json的Pyspark问题具有字符串和数组值的字段的主要内容,如果未能解决你的问题,请参考以下文章

PySpark - 获取具有相同值的数组元素的数量

使用 PySpark 和数据框转换 JSON 以在根下具有数组元素

使用 Pyspark 解析 JSON 字符串以查找列表中每个值的出现情况

如何解组具有不同类型值的json数组

Json - 在 pyspark 中展平键和值

如何在Java中解析具有空值的JSON对象?