将AzureINT,布尔值和时间戳数据从Azure Data Lake Parquet文件插入到Data Warehouse表中

问题描述

我有一个蔚蓝的数据工厂管道。

  • 步骤1将一些数据从天蓝色表存储复制到数据湖。
  • 第2步运行一个python脚本,该脚本会更改某些列名 然后以拼花形式将其写入数据湖中的另一个区域。
  • 第3步调用数据仓库中的存储过程,该存储过程使用 polybase将镶木地板数据插入到突触表中。

如果我仅在步骤2中使用字符串类型,而在存储过程中使用varchars,则没有问题。

def transform_data(df: DataFrame) -> DataFrame:
    df= df.select(
        ...
        col('some_column').alias('SomeColumn').cast('string'),...
    )


def write_data(df: DataFrame) -> None:
    df.write.mode('overwrite').parquet(my_data_path)

并在存储过程中

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

但是如果我添加一个tinyint例如

def transform_data(df: DataFrame) -> DataFrame:
    df= df.select(
        ...
        col('some_column').alias('SomeColumn').cast('string'),col('some_int_column').alias('SomeIntColumn').cast('tinyint'),...
    )


def write_data(df: DataFrame) -> None:
    df.write.mode('overwrite').parquet(my_data_path)

然后在存储过程中

CREATE EXTERNAL TABLE [domain].[TempTable] 
    (
        ...
        SomeColumn varchar(255) NULL,SomeIntColumn tinyint NULL,FILE_FORMAT = parquet_snappy
    )

然后我收到如下错误消息:

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')

我尝试在python脚本中将'tinyint'替换为'byte',但出现相同的错误

update:parquet-tools揭示了这一点:

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

对于'boolean'->'bit'和'timestamp'->'datetime2',我得到了不同的错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)