Как исключить строки в операции копирования данных в фабрике данных Azure? - PullRequest
2 голосов
/ 07 марта 2019

Я построил конвейер с одним действием копирования данных, которое копирует данные из 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"
                    }
                ]
            }
        ]
    }
}

1 Ответ

1 голос
/ 11 марта 2019

Это очень хороший вопрос (+1 за это), у меня был тот же вопрос несколько месяцев назад, и я был удивлен, что не смог найти что-либо в Copy Activity, чтобы справиться с этим (я даже пытался с функцией отказоустойчивости, ноне повезло).

И, учитывая, что в моих конвейерах происходили другие преобразования с U-SQL , я решил использовать его для этого.Итак, вместо операции копирования у меня есть U-SQL Activity в ADF с использованием оператора IS NOT NULL , это зависит от ваших данных, но вы можете поиграть с этим, возможно, со своей строкойсодержит "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 файлы

Дайте мне знать, если это поможет или приведенный выше пример не работает для ваших данных.Надеюсь, кто-нибудь опубликует ответ с помощью Copy Activity, и это было бы здорово, но пока это одна из возможностей.

...