Spark parquet merge metadata问题

 在spark sql 1.2.x当中存在一个问题:

当我们尝试在一个查询中访问多个parquet文件时,如果这些parquet文件中的字段名和类型是完全一致的、只是字段的顺序不一样,例如一个文件中是name string, id int,另一个文件是id int, name string时,查询会报错,抛出metadata merge的异常。

在1.3当中,这个问题其实已经解决。那么在1.2.x中解决的办法是:

在spark源码的sql/core/src/main/scala/org/apache/spark/sql/parquet/ParquetTableOperations.scala文件中,找到override def getSplits(configuration: Configuration, footers: JList[Footer]): JList[ParquetInputSplit]这个方法,在如下这段代码之前:

if (globalMetaData == null) {
     val splits = mutable.ArrayBuffer.empty[ParquetInputSplit]
     return splits
    }

将val globalMetaData改成 var globalMetaData

在上面这段代码之后加上如下几行:

val startTime = System.currentTimeMillis();
val metadata = configuration.get(RowWriteSupport.SPARK_ROW_SCHEMA)
val mergedMetadata = globalMetaData.getKeyValueMetaData.updated(RowReadSupport.SPARK_METADATA_KEY, setAsJavaSet(Set(metadata)))
globalMetaData = new GlobalMetaData(globalMetaData.getSchema, mergedMetadata, globalMetaData.getCreatedBy)
val endTime = System.currentTimeMillis();
logInfo("\n*** updated globalMetadata in " + (endTime - startTime) + " ms. ***\n");

其中第2-4行是必须的,这三行是从spark1.3里面摘出来的。其他三行只是想打个日志,看看这段代码放的执行时间。

然后就是编译源码了:

mvn -Phadoop-2.4 -Dhadoop.version=2.4.0 -Phive -Phive-thriftserver -DskipTests clean package
具体参考 http://spark.apache.org/docs/1.2.1/building-spark.html

我在一台服务器上测试了编译之后的spark,问题解决了,执行很顺利,性能没有任何影响。读取600个parquet文件,加上的几行代码只用了1ms左右。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值