0

我有一个 snappy.parquet 文件,其架构如下:

{
    "type": "struct",
    "fields": [{
            "name": "MyTinyInt",
            "type": "byte",
            "nullable": true,
            "metadata": {}

        }
        ...
    ]
}

更新:镶木地板工具揭示了这一点:

############ Column(MyTinyInt) ############
name: MyTinyInt
path: MyTinyInt
max_definition_level: 1
max_repetition_level: 0
physical_type: INT32
logical_type: Int(bitWidth=8, isSigned=true)
converted_type (legacy): INT_8

当我尝试在 Azure Data Studio 中运行存储过程以使用 PolyBase 将其加载到外部临时表中时,出现错误:

11:16:21Started executing query at Line 113
Msg 106000, Level 16, State 1, Line 1
HdfsBridge::recordReaderFillBuffer - Unexpected error encountered filling record reader buffer: ClassCastException: class java.lang.Integer cannot be cast to class parquet.io.api.Binary (java.lang.Integer is in module java.base of loader 'bootstrap'; parquet.io.api.Binary is in unnamed module of loader 'app')

仅使用 varchars 加载到外部表中工作正常

CREATE EXTERNAL TABLE [domain].[TempTable] 
    (
        ...
        MyTinyInt tinyint NULL,
        ...
        
    )
    WITH
    (
        LOCATION = ''' + @Location + ''',
        DATA_SOURCE = datalake,
        FILE_FORMAT = parquet_snappy
    )

数据最终将合并到数据仓库 Synapse 表中。在该表中,列必须是 tinyint 类型。

4

1 回答 1

2

我在 Azure 中有同样的问题和良好的支持计划,所以我得到了 Microsoft 的答复:

对于这种特殊情况,ADF 中存在一个已知错误:parquet 中的日期 类型应映射为 Sql 服务器中的数据类型日期,但是,ADF 错误地将这种类型转换为 Datetime2,这会导致 PolyBase 中的冲突。我已向核心工程团队确认,该问题将在 11 月底通过修复得到纠正,并将直接发布到 ADF 产品中。

与此同时,作为一种解决方法:

  1. 创建数据类型为DATE而不是DATETIME2的目标表
  2. 配置复制活动接收器设置以使用复制命令而不是 PolyBase

但是即使Copy 命令对我也不起作用,所以只有一种解决方法是使用Bulk insert,但是 Bulk 非常慢,并且在大数据集上这将是一个问题

于 2020-11-10T10:40:03.760 回答