首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spark:删除from_json后的空值或仅从json获取值

Spark:删除from_json后的空值或仅从json获取值
EN

Stack Overflow用户
提问于 2021-03-02 02:31:14
回答 1查看 378关注 0票数 0

我有一个带有JSON数据列的spark数据帧:

代码语言:javascript
运行
复制
df = spark.createDataFrame(
     [
         (1, '{"a": "hello"}'),
         (2, '{"b": ["foo", "bar"]}'),
         (3, '{"c": {"cc": "baz"}}'),
         (4, '{"d": [{"dd": "foo"}, {"dd": "bar"}]}'),
     ],
     schema=['id', 'jsonData'],
)

df.show()
+---+--------------------+
| id|            jsonData|
+---+--------------------+
|  1|      {"a": "hello"}|
|  2|{"b": ["foo", "ba...|
|  3|{"c": {"cc": "baz"}}|
|  4|{"d": [{"dd": "fo...|
+---+--------------------+

关键字是模式标识符。也就是说,两个键不能有不同的模式

我需要解析此列中的json,并从每个dict中获取值。

我运行下一个命令:

代码语言:javascript
运行
复制
from pyspark.sql.functions import from_json
json_schema = spark.read.json(df.select("jsonData").rdd.map(lambda x: x[0])).schema
df = df.withColumn("jsonParsedData", from_json("jsonData", json_schema))

df.show()
+---+--------------------+--------------------+
| id|            jsonData|      jsonParsedData|
+---+--------------------+--------------------+
|  1|      {"a": "hello"}|          [hello,,,]|
|  2|{"b": ["foo", "ba...|    [, [foo, bar],,]|
|  3|{"c": {"cc": "baz"}}|         [,, [baz],]|
|  4|{"d": [{"dd": "fo...|[,,, [[foo], [bar]]]|
+---+--------------------+--------------------+

我有一个

缺少键的值。

问题

:如何将JSON从

列,并获取一个不带

缺少键的值。

我认为

列应该有一个

类型。

预期结果

代码语言:javascript
运行
复制
+---+--------------------+--------------------+
| id|            jsonData|      jsonParsedData|
+---+--------------------+--------------------+
|  1|      {"a": "hello"}|               hello|
|  2|{"b": ["foo", "ba...|          [foo, bar]|
|  3|{"c": {"cc": "baz"}}|       {"cc": "baz"}|
|  4|{"d": [{"dd": "fo...|[{"dd": "foo"}, {...|
+---+--------------------+--------------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-02 03:12:47

尝试使用以下命令从json中提取值

代码语言:javascript
运行
复制
import pyspark.sql.functions as F

df2 = df.withColumn('jsonParsedData', F.regexp_extract('jsonData', '\\{"[^"]+": (.*)\\}', 1))

df2.show(truncate=False)
+---+-------------------------------------+------------------------------+
|id |jsonData                             |jsonParsedData                |
+---+-------------------------------------+------------------------------+
|1  |{"a": "hello"}                       |"hello"                       |
|2  |{"b": ["foo", "bar"]}                |["foo", "bar"]                |
|3  |{"c": {"cc": "baz"}}                 |{"cc": "baz"}                 |
|4  |{"d": [{"dd": "foo"}, {"dd": "bar"}]}|[{"dd": "foo"}, {"dd": "bar"}]|
+---+-------------------------------------+------------------------------+

另一种可能更好的方法是使用

的模式

代码语言:javascript
运行
复制
import pyspark.sql.functions as F

df2 = df.withColumn('jsonParsedData', F.map_values(F.from_json('jsonData', 'map'))[0])

df2.show(truncate=False)
+---+-------------------------------------+---------------------------+
|id |jsonData                             |jsonParsedData             |
+---+-------------------------------------+---------------------------+
|1  |{"a": "hello"}                       |hello                      |
|2  |{"b": ["foo", "bar"]}                |["foo","bar"]              |
|3  |{"c": {"cc": "baz"}}                 |{"cc":"baz"}               |
|4  |{"d": [{"dd": "foo"}, {"dd": "bar"}]}|[{"dd":"foo"},{"dd":"bar"}]|
+---+-------------------------------------+---------------------------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66427633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档