hive on spark ParquetDecodingException 异常 解决

hive | 2020-03-06 16:28:32

1.异常出现场景

集群环境参考:hive on spark集群环境搭建


spark 读取 mysql数据到 hive

var dataset=spark.read.format("jdbc").option("url", "jdbc:mysql://bcxw.net:3306/itxw").option("dbtable", "itxw").option("user", "root").option("password", "123456").option("partitionColumn", "ID").option("lowerBound", 1).option("upperBound", 200000000).option("numPartitions", 2000).load();
dataset.write().saveAsTable("itxw");

再通过hive 查询 spark导入的这个表,无论是直接启动hive,还是beelin 连接查询报错:

Failed with exception java.io.IOException:org.apache.parquet.io.ParquetDecodingException: Can not read value at 0 in block -1 in file hdfs://master:9000/user/hive/warehouse/datacenter.db/quest_score/part-00003-d54a6e3d-9e06-4f86-a89d-3ade8a1846f7-c000.snappy.parquet


2.解决方法

使用spark shell时直接在spark-defaults.conf添加 

spark.sql.parquet.writeLegacyFormat        true


或者代码中:


var spark=SparkSession.builder().appName("sparkSyncData")
      .config("spark.some.config.option", "some-value")
      .config("spark.sql.parquet.writeLegacyFormat", "true")
      .enableHiveSupport()
      .getOrCreate()

其实就是要在源头写入数据的时候配置

3.parquet 了解一下

==> 官网描述:

            Apache Parquet is a columnar storage format available to any project in the Hadoop ecosystem, regardless of the choice of data processing framework, data model or programming language

        无论数据处理框架,数据模型或编程语言的选择如何,Apache Parquet都是Hadoop生态系统中任何项目可用的列式存储格式(列式而不是行式)

==> 由来

    Parquet的灵感来自于2010年Google发表的Dremel论文,文中介绍了一种支持嵌套结构的存储格式,并且使用了列式存储的方式提升查询性能,在Dremel论文中还介绍了Google如何使用这种存储格式实现并行查询的,如果对此感兴趣可以参考论文和开源实现Apache Drill。

==> 特点:

    ---> 可以跳过不符合条件的数据,只读取需要的数据,降低 IO 数据量

    ---> 压缩编码可以降低磁盘存储空间(由于同一列的数据类型是一样的,可以使用更高效的压缩编码(如 Run Length Encoding t  Delta Encoding)进一步节约存储空间)

    ---> 只读取需要的列,支持向量运算,能够获取更好的扫描性能

    ---> Parquet 格式是 Spark SQL 的默认数据源,可通过 spark.sql.sources.default 配置



登录后即可回复 登录 | 注册
    
关注编程学问公众号