如何使用Azure Data Factory将数据从MySQL逐步导入Azure数据仓库?

时间:2017-06-01 08:10:35

标签: azure azure-sql-database azure-storage azure-storage-blobs azure-data-factory

我使用Azure Data Factory定期将数据从MySQL导入Azure SQL数据仓库。

数据通过Azure存储帐户上的暂存blob存储,但是当我运行管道时,它会失败,因为它无法将blob文本分离回列。管道尝试插入目标的每一行都成为一个长字符串,其中包含由"⯑"分隔的所有列值。字符。

之前我使用过数据工厂,没有尝试增量机制,而且运行正常。我没有看到它会导致这种行为的原因,但我可能会遗漏一些东西。

我附加了描述管道的JSON并进行了一些小的命名更改,如果您发现任何可以解释此问题的内容,请告诉我。

谢谢!

编辑:添加例外消息:

  

执行失败数据库操作失败。来自的错误消息   数据库执行:   错误码= FailedDbOperation,'类型= Microsoft.DataTransfer.Com mon.Shared.HybridDel iveryException,MESSA GE =错误   将数据加载到SQL数据时发生   仓库,源= Microsoft.DataTransfer.ClientLibrary,''典型值E = System.Data.SqlCli ent.SqlException,MES鼠尾草=查询   中止 - 达到最大拒绝阈值(0行)   从外部源读取:在总共1行中拒绝了1行   处理。   (/f4ae80d1-4560-4af9-9e74-05de941725ac/Data.8665812f-fba1-40 7A-9e04-2ee5f3ca5a7e .txt)的              列序数:27,预期数据类型:VARCHAR(45)整理SQL_Latin1_General_CP1_CI_AS,违规值:*值的行数   *(标记失败),错误:此列中没有足够的列   线,},]'

{
"name": "CopyPipeline-move_incremental_test",
"properties": {
    "activities": [
        {
            "type": "Copy",
            "typeProperties": {
                "source": {
                    "type": "RelationalSource",
                    "query": "$$Text.Format('select * from [table] where InsertTime >= \\'{0:yyyy-MM-dd HH:mm}\\' AND InsertTime < \\'{1:yyyy-MM-dd HH:mm}\\'', WindowStart, WindowEnd)"
                },
                "sink": {
                    "type": "SqlDWSink",
                    "sqlWriterCleanupScript": "$$Text.Format('delete [schema].[table] where [InsertTime] >= \\'{0:yyyy-MM-dd HH:mm}\\' AND [InsertTime] <\\'{1:yyyy-MM-dd HH:mm}\\'', WindowStart, WindowEnd)",
                    "allowPolyBase": true,
                    "polyBaseSettings": {
                        "rejectType": "Value",
                        "rejectValue": 0,
                        "useTypeDefault": true
                    },
                    "writeBatchSize": 0,
                    "writeBatchTimeout": "00:00:00"
                },
                "translator": {
                    "type": "TabularTranslator",
                    "columnMappings": "column1:column1,column2:column2,column3:column3"
                },
                "enableStaging": true,
                "stagingSettings": {
                    "linkedServiceName": "StagingStorage-somename",
                    "path": "somepath"
                }
            },
            "inputs": [
                {
                    "name": "InputDataset-input"
                }
            ],
            "outputs": [
                {
                    "name": "OutputDataset-output"
                }
            ],
            "policy": {
                "timeout": "1.00:00:00",
                "concurrency": 10,
                "style": "StartOfInterval",
                "retry": 3,
                "longRetry": 0,
                "longRetryInterval": "00:00:00"
            },
            "scheduler": {
                "frequency": "Hour",
                "interval": 1
            },
            "name": "Activity-0-_Custom query_->[schema]_[table]"
        }
    ],
    "start": "2017-06-01T05:29:12.567Z",
    "end": "2099-12-30T22:00:00Z",
    "isPaused": false,
    "hubName": "datafactory_hub",
    "pipelineMode": "Scheduled"
}

}

2 个答案:

答案 0 :(得分:1)

听起来你的行为是正确的,但数据形成不良(常见问题,没有UTF-8编码),因此ADF无法根据需要解析结构。当我遇到这种情况时,我经常需要向管道添加一个自定义活动来清理和准备数据,这样它就可以通过下游活动以结构化的方式使用。不幸的是,这是开发解决方案的一大笔开销,需要您编写一个C#类来处理数据转换。

另外请记住,ADF没有自己的计算,它只调用其他服务,因此您还需要Azure批处理服务来执行已编译的代码。

可悲的是,这里没有神奇的解决方法。 Azure非常适合提取和加载完美结构化的数据,但在现实世界中,我们需要其他服务来执行转换或清理,这意味着我们需要一个可以ETL或我更喜欢ECTL的管道。

以下是创建ADF自定义活动的链接,可帮助您入门:https://www.purplefrogsystems.com/paul/2016/11/creating-azure-data-factory-custom-activities/

希望这有帮助。

答案 1 :(得分:1)

当使用数据工厂v.2使用staging(暗示Polybase)从Azure sql db导入到Azure DWH时,我已经使用相同的消息了。我已经了解到Polybase将失败并显示与错误数据类型等相关的错误消息。我收到的消息与提到的here非常相似,即使我没有使用Polybase直接来自SQL,但是通过Data Factory。

无论如何,我的解决方案是避免十进制或数字类型的列的NULL值,例如ISNULL(mynumericCol,0)为mynumericCol。