问题描述
- 步骤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
)
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 (将#修改为@)