使用 Databricks 和 ADF 展平复杂的 json
Posted
技术标签:
【中文标题】使用 Databricks 和 ADF 展平复杂的 json【英文标题】:Flatten complex json using Databricks and ADF 【发布时间】:2022-01-24 03:34:41 【问题描述】:我有以下 json,我已经使用 explode 部分展平了
"result":[
"employee":[
"employeeType":
"name":"[empName]",
"displayName":"theName"
,
"groupValue":"value1"
,
"employeeType":
"name":"#bossName#",
"displayName":"theBoss"
,
"groupValue":[
"id":"1",
"type":
"name":"firstBoss",
"displayName":"CEO"
,
"name":"Martha"
,
"id":"2",
"type":
"name":"secondBoss",
"displayName":"cto"
,
"name":"Alex"
]
]
]
我需要获取以下字段:
employeeType.name
groupValue
我能够提取这些字段和值。但是,如果名称值以 "name":"#bossName#",
中的 # 开头,我将 groupValue 作为字符串获取,我需要从中提取 id 和名称。
"groupValue":[
"id":"1",
"type":
"name":"firstBoss",
"displayName":"CEO"
,
"name":"Martha"
,
"id":"2",
"type":
"name":"secondBoss",
"displayName":"cto"
,
"name":"Alex"
]
如何将此字符串转换为 json 并获取值。
到目前为止我的代码:
from pyspark.sql.functions import *
db_flat = (df.select(explode("result.employee").alias("emp"))
.withColumn("emp_name", col(emp.employeeType.name))
.withColumn("emp_val",col("emp.groupValue")).drop("emp"))
如何从 db_flat 中提取 groupValue 并从中获取 id 和 name。也许使用 python panda 库。
【问题讨论】:
您在 ADF 中使用哪个活动来执行此操作? @MarkKromerMSFT 我们正在使用 ADF 将 json 文件复制到数据库中具有上述字段的表中。我们使用了复制活动,但映射失败。groupValue
中是否总是有 2 个元素,或者您正在寻找动态方式
@KarthikBhyresh-MT 它总是有 2 个元素。它不会是动态的
【参考方案1】:
因为您看到它们不会是动态的。您可以在映射时遍历json
,如下所示。只需识别记录和数组,根据需要指定index [i]
。
例子:
id --> $['employee'][1]['groupValue'][0]['id']
name --> $['employee'][1]['groupValue'][0]['type']['name']
【讨论】:
嘿Karthik,谢谢,但在我的情况下,可能有几个员工。假设如果在复制活动中单独获取 50 条记录映射将是不可行的。有什么办法可以将数据块中的 json 展平,然后在复制活动中使用它。 啊,好的,让我看看以上是关于使用 Databricks 和 ADF 展平复杂的 json的主要内容,如果未能解决你的问题,请参考以下文章
Azure Data PlatformETL工具(22)——Azure Databricks与ADF整合
Azure Data PlatformETL工具(22)——Azure Databricks与ADF整合
Azure Data PlatformETL工具(19)——Azure Databricks