嗨,我正在尝试在当前镶木地板表中添加新列。当前模式是(string),b(int),c(string),我们要添加列d(string)。
我们有两种情况:
使用MergeSchema进行读取,它可以工作,但性能不佳,而且读取时间比写入时间长。
使用选项parquet.enable.summary-metadata / parquet.summary.metadata.level创建文件_common_metadata和_metadata。问题在于Spark由于架构不同而返回异常。错误出现在org.apache.parquet.hadoop.metadata.GlobalMetada中,合并方法
public FileMetaData merge() {
String createdByString = createdBy.size() == 1 ?
createdBy.iterator().next() :
createdBy.toString();
Map<String, String> mergedKeyValues = new HashMap<String, String>();
for (Entry<String, Set<String>> entry : keyValueMetaData.entrySet()) {
if (entry.getValue().size() > 1) {
throw new RuntimeException("could not merge metadata: key " + entry.getKey() + " has conflicting values: " + entry.getValue());
}
mergedKeyValues.put(entry.getKey(), entry.getValue().iterator().next());
}
return new FileMetaData(schema, mergedKeyValues, createdByString);
}
该方法引发RuntimeException(“无法合并元数据:键” + entry.getKey()+“的值存在冲突:” + entry.getValue()),因为entry.getValue具有多个模式(一个带有列: abc和一个带有abcd的方法。我们的方法是修改此类,以评估架构是否只有新列,并返回包含所有列的架构,它的工作原理是可行的,但我们必须检查更多场景
¿有人使用选项parquet.enable.summary-metadata / parquet.summary.metadata.level并可以在多个模式下正常工作吗?