1.异常出现场景
集群环境参考:
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 配置