雪花:因异常 java.io.IOException 失败:org.apache.parquet.io.ParquetDecodingException:无法在块 -1 中读取 0 处的值
Posted
技术标签:
【中文标题】雪花:因异常 java.io.IOException 失败:org.apache.parquet.io.ParquetDecodingException:无法在块 -1 中读取 0 处的值【英文标题】:Snowflake: Failed with exception java.io.IOException:org.apache.parquet.io.ParquetDecodingException: Can not read value at 0 in block -1 【发布时间】:2020-06-30 15:23:31 【问题描述】:将镶木地板格式的数据从 Snowflake 卸载到 s3 后,我正在创建一个具有等效雪花架构的 Hive 表,并将 s3 作为外部位置,但我收到以下错误:
Failed with exception java.io.IOException:org.apache.parquet.io.ParquetDecodingException: Can not read value at 0 in block -1
Snowflake 卸载 spark 作业似乎不支持旧格式。问题描述为here。
雪花模式:
create or replace TABLE table_name cluster by ( COL_1, COL_2 )(
COL_1 VARCHAR(16777216) NOT NULL,
COL_2 NUMBER(38,0),
COL_3 VARCHAR(16777216),
COL_4 VARCHAR(16777216),
COL_5 VARCHAR(16777216),
COL_6 NUMBER(38,0),
COL_7 TIMESTAMP_NTZ(0),
COL_8 VARCHAR(16777216),
COL_9 VARCHAR(16777216),
COL_10 NUMBER(38,0),
COL_11 NUMBER(38,0)
);
Hive 架构:
CREATE EXTERNAL TABLE `DEAL_COUNTRY_MAP`(
`COL_1` string,
`COL_2` decimal(38,0),
`COL_3` string,
`COL_4` string,
`COL_5` string,
`COL_6` decimal(38,0),
`COL_7` timestamp,
`COL_8` string,
`COL_9` string,
`COL_10` decimal(38,0),
`COL_11` decimal(38,0))
ROW FORMAT SERDE
'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION
's3a://schemaname.tablename/20200626/data'
TBLPROPERTIES ('parquet.compress'='SNAPPY');
在 Hive 架构中,我也尝试了 varchar
而不是 string
,但也没有用。
【问题讨论】:
我发现的问题是,雪花是大写的导出列名信息,而 HIVE 使用的是小写的列名。 【参考方案1】:我不确定,因为现在 SF 有一个解决方案可以在 Spark 中生成所谓的 Parquet 文件的“LegacyFormat”。
对于我们的业务用例,在从 Snowflake 上传文件后,我们总是有一个转换 Spark 作业(因为目前它不能转储时间戳类型列等),所以我们对从 SF 转储的 parquet 文件有这个转换逻辑到数据湖使用
处理时间戳类型列 确保所有列名都转换为 AWS Glue 的小写 确保“LegacyFormat”【讨论】:
以上是关于雪花:因异常 java.io.IOException 失败:org.apache.parquet.io.ParquetDecodingException:无法在块 -1 中读取 0 处的值的主要内容,如果未能解决你的问题,请参考以下文章