簡體   English   中英

ADF 數據流 在構建 JSON 文件時刪除空的 JSON 對象和 arrays

[英]ADF Data Flow Remove empty JSON objects and arrays when building JSON files

我在 Azure 數據工廠中使用數據流將 CSV 文件的行轉換為標准布局的 JSON 文檔。 當沒有數據要填充時,我不知道如何擺脫空的 JSON 對象和 arrays。

例如,如果我有如下所示的 CSV:

firstName,lastName,Email,Address1,City,State,Zip
Bob,Smith,someemail@email.com,123 st,Somecity,TX,12345

我需要把它變成這樣:

{
    "firstName": "Bob",
    "lastName": "Smith",
    "contactData": [
        {
            "contactType": "postalAddress",
            "contactData": {
                "postalAddress1": "123 st",
                "postalCity": "Somecity",
                "postalState": "TX",
                "postalCode": "12345"
            }
        },
        {
            "contactType": "email",
            "contactData": {
                "emailAddress": "someemail@email.com"
            }
        }
    ]
}

我正在使用派生列來構建子列和 arrays。我已經能夠生成上面的 JSON。 我遇到的問題是,如果 email 或地址是 null,我想從數組中刪除 object。 如果兩者都是 null,我想刪除整個 contactData object。

例子:

firstName,lastName,Email,Address1,City,State,Zip
Bob,Smith,,,,,

我需要把它變成這樣:

{
    "firstName": "Bob",
    "lastName": "Smith"
}

如果我使用 IF 語句將所有子對象設置為 NULL,我可以生成如下內容:

{
    "firstName": "Bob",
    "lastName": "Smith",
    "contactData": [
        {
            "contactData": {}
        },
        {
            "contactData": {}
        }
    ]
}

但我無法擺脫整個部分。 Sink 將擺脫空字符串對象,但不會擺脫嵌套的 JSON 對象和 arrays。在 ADF 數據流中有什么方法可以做到這一點嗎?

  • 您可以拆分數據,然后應用並集以獲得所需的結果。
  • 由於我沒有前面的數據轉換,所以我將以下數據作為我的源數據。
[{
    "firstName": "Bob",
    "lastName": "Smith",
    "contactData": [
        {
            "contactType": "postalAddress",
            "contactData": {
                "postalAddress1": "123 st",
                "postalCity": "Somecity",
                "postalState": "TX",
                "postalCode": "12345"
            }
        },
        {
            "contactType": "email",
            "contactData": {
                "emailAddress": "someemail@email.com"
            }
        }
    ]
},
{
    "firstName": "b1",
    "lastName": "s1",
    "contactData": [
        {
            "contactData": {}
        },
        {
            "contactData": {}
        }
    ]
},
{
    "firstName": "Bob1",
    "lastName": "Smith1",
    "contactData": [
        {
            "contactType": "postalAddress",
            "contactData": {
                "postalAddress1": "123 st1",
                "postalCity": "Somecity1",
                "postalState": "TX1",
                "postalCode": "123456"
            }
        },
        {
            "contactType": "email",
            "contactData": {
                "emailAddress": "someemail1@email.com"
            }
        }
    ]
},
{
    "firstName": "b2",
    "lastName": "s2",
    "contactData": [
        {
            "contactData": {}
        },
        {
            "contactData": {}
        }
    ]
}]
  • 現在,我采用了示例派生列來查找contactType的長度。 沒有任何contactType的行將具有相同的長度(轉換為字符串並查找長度)。
tp : length(toString(contactData.contactType))

在此處輸入圖像描述

  • 因此,根據contactType (轉換為字符串)長度是否等於 2 來拆分數據。 拆分條件如下所示:
length(toString(contactData.contactType))!=2

在此處輸入圖像描述

  • 這將根據需要拆分數據。 noContact stream 將具有以下數據:

在此處輸入圖像描述

  • 現在 select 只需要列。 我已將基於規則的選擇用於select 只有名稱不是 contactData 的列
condition : name!='contactData'
column name : $$

在此處輸入圖像描述

  • 現在在hasContactselect1 stream 上按Name應用聯合轉換。

在此處輸入圖像描述

  • 我已經配置了接收器數據集,如下圖所示:

在此處輸入圖像描述

  • 在 sink 中,output 到單個 JSON 文件(在設置選項卡下)。 接收器中的數據預覽如下:

在此處輸入圖像描述

  • 寫入文件后,null字段不會被寫入,所以數據是按要求的。 以下是供參考的圖像。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM