我有json数据,比如

{
"labels1":
     {"A":1,"B":2, "C":3},
"labels2":
     {"A":1,"B":2, "C":3},
}

我想要3个输出列,标记名,关键字名称,值.最终输出将如下所示

tagname,key,value
labels1,A,1
labels1,B,2
labels1,C,3
labels2,A,1
labels2,B,2
labels2,C,3

我如何才能实现这个用例,而且关键字A、B、C只是示例,并且可以有多个可选字段.事先感谢,如果需要更多的信息,请让我知道.

推荐答案

在本例中,try 使用内置的pyspark函数,如stackunnest,该 struct 将作为新列添加.

100

from pyspark.sql.functions import *
json = """{"labels1":{"A":1,"B":2, "C":3},"labels2":{"A":1,"B":2, "C":3}}"""
df = spark.read.json(sc.parallelize([json]), multiLine=True)
df.select(expr("stack(2,'labels1',labels1,'labels2',labels2)")).\
  select(col("col0").alias("tagname"),col("col1.*")).\
  select("tagname",expr("stack(3,'A',A,'B',B,'C',C) as (key,value)")).show()

#+-------+---+-----+
#|tagname|key|value|
#+-------+---+-----+
#|labels1|  A|    1|
#|labels1|  B|    2|
#|labels1|  C|    3|
#|labels2|  A|    1|
#|labels2|  B|    2|
#|labels2|  C|    3|
#+-------+---+-----+

使用100函数的另一种方式:

df.withColumn("n",lit(1)).\
  unpivot("n",["labels1", "labels2"],"new","new1").select(col("new").alias("tagname"),col("new1.*")).\
  unpivot("tagname",["A","B","C"],"key","value").\
  show()

Json相关问答推荐

中间初始化的Jolt配置

使用Powershell脚本将配置信息块添加到json文件

无法根据vega规范中的条件设置文本 colored颜色

PostgreSQL 12.17从JSON数组提取元素

我可以使用JQ来缩小数组中的json对象的范围吗?

属性错误:';ActivitiesClient';对象没有属性';base_url';

使用自定义类型在Golang中解析JSON数组

Moshi:序列化 List 时出现问题

如何按键过滤

使用 Groovy 将 XML 转换为 JSON

如何从字符串中创建一个逗号分隔的列表,由 API 中的 JSON 对象内的编号空格分隔?

通过 xslt 将内部 json 转换为 xml 时遇到问题

如何迭代、动态加载我的表单输入元素,然后在 React 中的表单提交上检索输入值?

使用带有逗号的字段名称构建 struct

如何从 rails 中的 respond_to 方法生成 json?

在 Rails 3 中处理 JS/ERB 模板中的 JSON

在 JSON 对象中强制执行非空字段

带有方法参数的 WCF webHttpBinding 错误. 最多可以在没有包装元素的情况下序列化一个主体参数

使用 jQuery 和 JSON 填充表单?

Javascript对象和JSON对象有什么区别