FAQ-spark执行的数据hive查询报错0 in block -1
更新时间: 2024-03-11 02:51:36
阅读 4348
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
问题原因
此问题是由于在Hive和Spark中使用不同的seder定引起的.在Hive中,十进制数据类型表示为固定字节(INT 32).在Spark 1.4或更高版本中,默认约定是对十进制数据类型使用标准Parquet表示形式.根据基于列数据类型的精度的标准Parquet表示形式,基础表示形式也会发生变化.
例如: DECIMAL可用于注释以下类型: int32:表示1 <=精度<= 9 int64:1≤精度≤18;精度< 10将产生异常,仅在使用不同Parquet约定中具有不同表示形式的数据类型时,才会发生此问题.如果数据类型为DECIMAL(10,3),则两种约定都将其表示为INT32,因此我们不会遇到问题.如果您不了解数据类型的内部表示形式,则可以安全地使用读取时进行写入的相同约定.
作者:qianzhaoyuan
文档反馈
以上内容对您是否有帮助?