使用 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整合

如何从 ADF 中的执行管道获取输出参数?

Azure Data PlatformETL工具(19)——Azure Databricks

Azure Data PlatformETL工具(19)——Azure Databricks

如何在 ADF 中从 SharePoint 下载更新的文件?