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 和数据框转换 JSON 以在根下具有数组元素