使用Spark在镶木地板表中使用新列进行架构演化

时间:2019-12-03 15:49:22

标签: apache-spark hadoop parquet

嗨,我正在尝试在当前镶木地板表中添加新列。当前模式是(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并可以在多个模式下正常工作吗?

0 个答案:

没有答案