FAQ - org.apache.parquet.io.ParquetDecodingException: Can not read value at 0 in block -1 in file xxx

问题描述/异常栈

spark执行的数据,hive查询异常
hive查询报异常:org.apache.hive.service.cli.HiveSQLException: java.io.IOException: org.apache.parquet.io.ParquetDecodingException: Can not read value at 0 in block -1 in file hdfs://easyops-cluster/user/hxlc_edw/hive_db/edw_dwd.db/test_dwd_t02_prd_integrated_dynamic_tempasc/part-00000-3af1a936-bb6a-4946-af43-96f923882f0f-c000.snappy.parquet

解决方案

spark写数据的时候加上
set spark.sql.parquet.writeLegacyFormat=true;
或者在离线开发里面添加
conf.spark.sql.parquet.writeLegacyFormat  true

问题原因

此问题是由于在HiveSpark中使用不同的seder定引起的.在Hive中,十进制数据类型表示为固定字节(INT 32).在Spark 1.4或更高版本中,默认约定是对十进制数据类型使用标准Parquet表示形式.根据基于列数据类型的精度的标准Parquet表示形式,基础表示形式也会发生变化.
例如: DECIMAL可用于注释以下类型: int32:表示1 <=精度<= 9 int64:1≤精度≤18;精度< 10将产生异常,仅在使用不同Parquet约定中具有不同表示形式的数据类型时,才会发生此问题.如果数据类型为DECIMAL(10,3),则两种约定都将其表示为INT32,因此我们不会遇到问题.如果您不了解数据类型的内部表示形式,则可以安全地使用读取时进行写入的相同约定.

作者:qianzhaoyuan