我使用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"
}
}
答案 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。