Spark AVRO与BigQuery兼容

时间:2017-12-18 09:47:00

标签: apache-spark hive google-bigquery avro

我试图在Hive中创建一个外部表,而另一个在BigQuery中使用以Avro格式存储在Google Storage中的相同数据在Spark中编写。

我正在使用带有Spark 2.2.0,Spark-avro 4.0.0和Hive 2.1.1的Dataproc群集

Avro版本/软件包之间存在相同的差异,但如果我使用Hive创建表,然后使用Spark编写文件,我就可以在Hive中看到它们。

但是对于BigQuery而言,它能够读取Hive Avro文件,但不能读取Spark Avro文件。

错误:

The Apache Avro library failed to parse the header with the follwing error: Invalid namespace: .someField

稍微搜索一下错误,问题是Spark Avro文件与Hive / BigQuery Avro文件不同。

我不知道如何解决这个问题,也许在Spark中使用不同的Avro软件包,但我还没有发现哪一个与所有系统兼容。

此外,我想避免棘手的解决方案,比如在Hive中创建一个临时表,并使用insert into ... select * from ...创建另一个,我会写出大量数据,我想避免这种解决方案

任何帮助将不胜感激。感谢

3 个答案:

答案 0 :(得分:1)

BigQuery使用的C ++ Avro库抛出了错误消息。 Hive可能使用Java Avro库。 C ++库不喜欢以"开头的名称空间。"。

这是图书馆的代码:

if (! ns_.empty() && (ns_[0] == '.' || ns_[ns_.size() - 1] == '.' || std::find_if(ns_.begin(), ns_.end(), invalidChar1) != ns_.end())) {
  throw Exception("Invalid namespace: " + ns_);
}

答案 1 :(得分:1)

Spark-avro具有附加选项recordNamespace来设置根名称空间,因此它不会从.开始。

https://github.com/databricks/spark-avro/blob/branch-4.0/README-for-old-spark-versions.md

答案 2 :(得分:0)

想知道你是否找到了答案。

我看到同样的事情,我试图将数据加载到bigquery表中。该库首先以avro格式将数据加载到GCS中。模式也有一个struct数组,命名空间有.

相关问题