标签:spark parquet metadata sql 异常
在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 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");
然后就是编译源码了:
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左右。
Spark parquet merge metadata问题
标签:spark parquet metadata sql 异常
原文地址:http://blog.csdn.net/bhq2010/article/details/45501017