json - Spark 在列中拆分和解析 json
问题描述
我有一个 PySpark 数据框:
catalogid | 1123798
catalogpath | [{"1123798":"Other, poets"},{"1112194":" Poetry for kids"}
使用架构:
StructType(List(StructField(catalogid,StringType,true),StructField(catalogpath,StringType,true)))
而且我只需要从目录路径列中获取文本(值) - 如下所示:
catalogid | 1123798
catalog_desc| "Other, poets"; "Poetry for kids"
解决方案
您可以使用 JSON 解析器:
import json
from itertools import chain
from pyspark.sql.functions import udf, concat_ws
@udf("array<string>")
def parse(s):
try:
return list(chain.from_iterable(x.values() for x in json.loads(s)))
except:
pass
df = spark.createDataFrame(
[(1123798, """[{"1123798":"Other, poets"},{"1112194":" Poetry for kids"}]""")],
("catalogid", "catalogpath")
)
result = df.select("catalogid", parse("catalogpath").alias("catalog_desc"))
result.show(truncate=False)
# +---------+----------------------------------+
# |catalogid|catalog_desc |
# +---------+----------------------------------+
# |1123798 |[Other, poets, Poetry for kids]|
# +---------+----------------------------------+
如果你想要一个字符串,你可以申请concat_ws
:
result.withColumn("catalog_desc", concat_ws(";", "catalog_desc")).show(truncate=False)
# +---------+-------------------------------+
# |catalogid|catalog_desc |
# +---------+-------------------------------+
# |1123798 |Other, poets; Poetry for kids|
# +---------+-------------------------------+
推荐阅读
- mysql - 如何捕获事件 X 的日期,然后捕获事件 X 之后发生的事件的日期
- sql - 为什么我不断收到此错误:SQL 命令未正确结束以插入值?
- python - 如何通过其中一个键对字典进行分组?
- android - 离子构建Android | CordovaError:JDK 1.8.x 的要求检查失败!检测到的版本:512.0.0
- zsh - 在引号处拆分字符串
- azure - 如何使用 Azure API 管理和 Azure Redis 缓存检查缓存响应的年龄
- discord - Discord权限检查不起作用dsicord js
- bigcommerce - BigCommerce 访问模板文件中的用户语言代码和货币
- node.js - 即使我关闭了 PeerConnection,我也会看到黑屏。请帮我解决这个问题
- ios - 得到 401 尝试从 URLSession 请求登录