雪花:因异常 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 处的值的主要内容,如果未能解决你的问题,请参考以下文章

TCP 上传文件

ServletDownload

java读写properties文件

雪花程序因任务执行而失败

java中怎么实现ftp文件传输

以数组为参数的雪花函数因不支持的子查询错误而失败