gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:58 25 4
gpt4 key购买 nike

尝试将 StringType 转换为 JSON 的 ArrayType,以生成 CSV 格式的数据框。

Spark2 上使用 pyspark

我正在处理的 CSV 文件;如下-

date,attribute2,count,attribute3
2017-09-03,'attribute1_value1',2,'[{"key":"value","key2":2},{"key":"value","key2":2},{"key":"value","key2":2}]'
2017-09-04,'attribute1_value2',2,'[{"key":"value","key2":20},{"key":"value","key2":25},{"key":"value","key2":27}]'

如上所示,它在文字字符串中包含一个属性“attribute3”,从技术上讲,它是一个精确长度为2的字典(JSON)列表。(这是函数distinct的输出)

来自 printSchema() 的片段

attribute3: string (nullable = true)

我正在尝试将 "attribute3" 转换为 ArrayType,如下所示

temp = dataframe.withColumn(
"attribute3_modified",
dataframe["attribute3"].cast(ArrayType())
)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() takes at least 2 arguments (1 given)

确实,ArrayType 需要数据类型作为参数。我尝试使用 "json",但没有成功。

期望的输出 -最后,我需要将 attribute3 转换为 ArrayType() 或简单的 Python 列表。 (我试图避免使用 eval)

如何将其转换为 ArrayType,以便将其视为 JSON 列表?

我在这里遗漏了什么吗?

(documentation,没有直接解决这个问题)

最佳答案

使用from_json使用与 attribute3 列中的实际数据匹配的模式将 json 转换为 ArrayType:

原始数据框:

df.printSchema()
#root
# |-- date: string (nullable = true)
# |-- attribute2: string (nullable = true)
# |-- count: long (nullable = true)
# |-- attribute3: string (nullable = true)

from pyspark.sql.functions import from_json
from pyspark.sql.types import *

创建架构:

schema = ArrayType(
StructType([StructField("key", StringType()),
StructField("key2", IntegerType())]))

使用from_json:

df = df.withColumn("attribute3", from_json(df.attribute3, schema))

df.printSchema()
#root
# |-- date: string (nullable = true)
# |-- attribute2: string (nullable = true)
# |-- count: long (nullable = true)
# |-- attribute3: array (nullable = true)
# | |-- element: struct (containsNull = true)
# | | |-- key: string (nullable = true)
# | | |-- key2: integer (nullable = true)

df.show(1, False)
#+----------+----------+-----+------------------------------------+
#|date |attribute2|count|attribute3 |
#+----------+----------+-----+------------------------------------+
#|2017-09-03|attribute1|2 |[[value, 2], [value, 2], [value, 2]]|
#+----------+----------+-----+------------------------------------+

关于python - 如何在 PySpark 中将字符串转换为字典的 ArrayType (JSON),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51713790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com