【问题标题】:How can I exclude rows in a Copy Data Activity in Azure Data Factory?如何在 Azure 数据工厂的复制数据活动中排除行?
【发布时间】:2019-03-07 18:17:20
【问题描述】:

我已经构建了一个带有一个复制数据活动的管道,该活动从Azure Data Lake 复制数据并将其输出到Azure Blob Storage

在输出中,我可以看到我的某些行没有数据,我想将它们从副本中排除。在下面的例子中,第 2 行没有有用的数据:

{"TenantId":"qa","Timestamp":"2019-03-06T10:53:51.634Z","PrincipalId":2,"ControlId":"729c3b6e-0442-4884-936c-c36c9b466e9d","ZoneInternalId":0,"IsAuthorized":true,"PrincipalName":"John","StreetName":"Rue 1","ExemptionId":8}
{"TenantId":"qa","Timestamp":"2019-03-06T10:59:09.74Z","PrincipalId":null,"ControlId":null,"ZoneInternalId":null,"IsAuthorized":null,"PrincipalName":null,"StreetName":null,"ExemptionId":null}

问题

在复制数据活动中,如何设置规则以排除缺少某些值的行?

这是我的管道代码:

{
    "name": "pipeline1",
    "properties": {
        "activities": [
            {
                "name": "Copy from Data Lake to Blob",
                "type": "Copy",
                "policy": {
                    "timeout": "7.00:00:00",
                    "retry": 0,
                    "retryIntervalInSeconds": 30,
                    "secureOutput": false,
                    "secureInput": false
                },
                "userProperties": [
                    {
                        "name": "Source",
                        "value": "tenantdata/events/"
                    },
                    {
                        "name": "Destination",
                        "value": "controls/"
                    }
                ],
                "typeProperties": {
                    "source": {
                        "type": "AzureDataLakeStoreSource",
                        "recursive": true
                    },
                    "sink": {
                        "type": "BlobSink",
                        "copyBehavior": "MergeFiles"
                    },
                    "enableStaging": false,
                    "translator": {
                        "type": "TabularTranslator",
                        "columnMappings": {
                            "Body.TenantId": "TenantId",
                            "Timestamp": "Timestamp",
                            "Body.PrincipalId": "PrincipalId",
                            "Body.ControlId": "ControlId",
                            "Body.ZoneId": "ZoneInternalId",
                            "Body.IsAuthorized": "IsAuthorized",
                            "Body.PrincipalName": "PrincipalName",
                            "Body.StreetName": "StreetName",
                            "Body.Exemption.Kind": "ExemptionId"
                        }
                    }
                },
                "inputs": [
                    {
                        "referenceName": "qadl",
                        "type": "DatasetReference"
                    }
                ],
                "outputs": [
                    {
                        "referenceName": "datalakestaging",
                        "type": "DatasetReference"
                    }
                ]
            }
        ]
    }
}

【问题讨论】:

    标签: azure azure-data-factory


    【解决方案1】:

    这是一个非常好的问题(+1),几个月前我也有同样的问题,我很惊讶在复制活动中找不到任何东西来处理这个问题(我什至尝试了容错功能,但是没有运气)。

    鉴于我在使用U-SQL 的管道中正在进行其他转换,我最终使用它来完成此任务。因此,我使用 IS NOT NULL 运算符在 ADF 中使用 U-SQL Activity 而不是复制活动,这取决于您的数据,但您可以使用它,也许您的字符串包含“NULL”或空字符串“”,这是它看起来如何:

    DECLARE @file_set_path string = "adl://myadl.azuredatalake.net/Samples/Data/{date_utc:yyyy}{date_utc:MM}{date_utc:dd}T{date_utc:HH}{date_utc:mm}{date_utc:ss}Z.txt";
    
    @data =
        EXTRACT 
                [id] string,
                date_utc DateTime
        FROM @file_set_path
        USING Extractors.Text(delimiter: '\u0001', skipFirstNRows : 1, quoting:false);
    
    @result =
        SELECT 
    
                [id] ,
                date_utc.ToString("yyyy-MM-ddTHH:mm:ss") AS SourceExtractDateUTC
        FROM @data
        WHERE id IS NOT NULL -- you can also use WHERE id <> "" or <> "NULL";
    
    OUTPUT @result TO "wasb://samples@mywasb/Samples/Data/searchlog.tsv" USING Outputters.Text(delimiter: '\u0001', outputHeader:true);
    

    注意:支持 ADLS 和 Blob 存储INPUT/OUTPUT files

    让我知道这是否有帮助,或者上面的示例是否不适用于您的数据。 希望有人会使用 Copy Activity 发布答案,这太棒了,但到目前为止这是一种可能性。

    【讨论】:

    • 我会试试这个并尽快让你知道:)
    • 我越看这个,我就越想知道我是否做对了。复制数据是[意味着](在两个基于文件的数据存储之间按原样复制文件,在这种情况下,数据被有效复制,无需任何序列化/反序列化)按原样复制数据,无需任何序列化/反序列化.这或许可以解释为什么 Copy Data 活动没有选项...
    • @Kzrystof 同意,删除空值可能被视为一种转换,您可以使用 Python (Databricks) 或 U-SQL 执行此操作,如果将其存储到 SQL 表中,甚至可以使用 SQL。但是,复制活动的设置选项卡下已经有容错功能,这可能是一个很好的地方,如果您已经可以跳过“不兼容”的行,我不明白为什么不跳过特定列为 NULL 的行 =)反正我的 2 美分。
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2020-09-15
    • 2022-06-23
    • 2022-01-26
    • 2021-09-08
    • 1970-01-01
    • 2021-06-10
    • 2021-06-13
    相关资源
    最近更新 更多