使用Azure数据工厂从Azure表存储中提取数据时出错

时间:2017-04-12 07:49:28

标签: sql data-warehouse azure-sql-database azure-data-factory

我想使用Azure数据工厂将数据从Azure表存储复制到Azure SQL Server,但是我收到了一个奇怪的错误。

在我的Azure表存储中,我有一个包含多种数据类型的列(这就是Table Storage的工作方式)。日期时间和字符串。

在我的Data Factory项目中,我提到整个列都是字符串,但由于某种原因,数据工厂假定数据类型基于它在提取过程中遇到的第一个单元格。

在我的Azure SQL Server数据库中,所有列都是字符串。

实施例

我在Azure表存储中使用此表:航班

RowKey   PartitionKey   ArrivalTime
--------------------------------------------------
1332-2   2213dcsa-213   04/11/2017 04:53:21.707 PM   - this cell is DateTime

1332-2   2213dcsa-214   DateTime.Null                - this cell is String

如果我的表格如下所示,则复制过程将起作用,因为第一行是字符串,它会将整个列转换为字符串。

RowKey   PartitionKey   ArrivalTime
--------------------------------------------------
1332-2   2213dcsa-214   DateTime.Null                - this cell is String

1332-2   2213dcsa-213   04/11/2017 04:53:21.707 PM   - this cell is DateTime

注意:我不允许更改Azure表存储中的数据类型,移动行或添加新行。

以下是Azure Data Factory的输入和输出数据集:

       "datasets": [
        {
            "name": "InputDataset",
            "properties": {
                "structure": [
                    {
                        "name": "PartitionKey",
                        "type": "String"
                    },
                    {
                        "name": "RowKey",
                        "type": "String"
                    },
                    {
                        "name": "ArrivalTime",
                        "type": "String"
                    }
                ],
                "published": false,
                "type": "AzureTable",
                "linkedServiceName": "Source-AzureTable",
                "typeProperties": {
                    "tableName": "flights"
                },
                "availability": {
                    "frequency": "Day",
                    "interval": 1
                },
                "external": true,
                "policy": {}
            }
        },
        {
            "name": "OutputDataset",
            "properties": {
                "structure": [
                    {
                        "name": "PartitionKey",
                        "type": "String"
                    },
                    {
                        "name": "RowKey",
                        "type": "String"
                    },
                    {
                        "name": "ArrivalTime",
                        "type": "String"
                    }
                ],
                "published": false,
                "type": "AzureSqlTable",
                "linkedServiceName": "Destination-SQLAzure",
                "typeProperties": {
                    "tableName": "[dbo].[flights]"
                },
                "availability": {
                    "frequency": "Day",
                    "interval": 1
                },
                "external": false,
                "policy": {}
            }
        }
    ]

有谁知道这个问题的解决方案?

1 个答案:

答案 0 :(得分:0)

我一直在玩这个。我认为你有两种方法可以解决这个问题。

选项1

只需从输入数据集中删除数据类型属性即可。在输入JSON表数据集的“结构”块中,您不必指定type属性。删除或评论它。

例如:

{
"name": "InputDataset-ghm",
"properties": {
    "structure": [
        {
            "name": "PartitionKey",
            "type": "String"
        },
        {
            "name": "RowKey",
            "type": "String"
        },
        {
            "name": "ArrivalTime"
            /* "type": "String"  --<<<<<<  Optional! */
        },

这应该意味着数据类型在读取时未经过验证。

选项2

使用SQL DB表加载上游的自定义活动来清理和转换表数据。这将意味着打破C#并需要更多的开发时间。但您可能希望将清洁代码重用于其他数据集。

希望这有帮助。