使用 Python/ Spark on Databricks 操作示例 json 列表
Manipulating sample json lists using Python/ Spark on Databricks
正在尝试对以下示例 json 列表进行逻辑解析:
FruitJson = [
('{"num":100, "fruit" : ["apple", "peach", "grape", "melon"]}',),
('{"num":101, "fruit" : ["melon", "apple", "mango", "banana"]}',),
]
理想输出:
水果
计数
苹果
2
甜瓜
2
桃色
1
葡萄
1
芒果
1
香蕉
1
我设法将列表的第一行放入数据框中,但无法从这里进一步推进:
dbutils.fs.put("/temp/test.json",'{"num":100, "fruit" : ["apple", "peach", "grape", "melon"]}'\
'{"num":101, "fruit" : ["melon", "apple", "mango", "banana"]}',True)
df = spark.read.option("multiline","true").json('/temp/test.json')
display(df)
非常感谢您的建议。
首先,您的 multiline
选项应该是 False
,而不是 True
。 multiline=False
表示您的 JSON 有多行,每行一行。 Docs
其次,您要实现的是一个简单的聚合,但您需要先 explode
将列表分成多行。
from pyspark.sql import functions as F
(df
.withColumn('fruit', F.explode('fruit'))
.groupBy('fruit')
.agg(
F.count('*').alias('cnt')
)
.show()
)
# +------+---+
# | fruit|cnt|
# +------+---+
# | grape| 1|
# | apple| 2|
# | mango| 1|
# |banana| 1|
# | melon| 2|
# | peach| 1|
# +------+---+
正在尝试对以下示例 json 列表进行逻辑解析:
FruitJson = [
('{"num":100, "fruit" : ["apple", "peach", "grape", "melon"]}',),
('{"num":101, "fruit" : ["melon", "apple", "mango", "banana"]}',),
]
理想输出:
水果 | 计数 |
---|---|
苹果 | 2 |
甜瓜 | 2 |
桃色 | 1 |
葡萄 | 1 |
芒果 | 1 |
香蕉 | 1 |
我设法将列表的第一行放入数据框中,但无法从这里进一步推进:
dbutils.fs.put("/temp/test.json",'{"num":100, "fruit" : ["apple", "peach", "grape", "melon"]}'\
'{"num":101, "fruit" : ["melon", "apple", "mango", "banana"]}',True)
df = spark.read.option("multiline","true").json('/temp/test.json')
display(df)
非常感谢您的建议。
首先,您的 multiline
选项应该是 False
,而不是 True
。 multiline=False
表示您的 JSON 有多行,每行一行。 Docs
其次,您要实现的是一个简单的聚合,但您需要先 explode
将列表分成多行。
from pyspark.sql import functions as F
(df
.withColumn('fruit', F.explode('fruit'))
.groupBy('fruit')
.agg(
F.count('*').alias('cnt')
)
.show()
)
# +------+---+
# | fruit|cnt|
# +------+---+
# | grape| 1|
# | apple| 2|
# | mango| 1|
# |banana| 1|
# | melon| 2|
# | peach| 1|
# +------+---+