Apache spark Spark AVRO与BigQuery兼容

Apache spark Spark AVRO与BigQuery兼容,apache-spark,hive,google-bigquery,avro,Apache Spark,Hive,Google Bigquery,Avro,我正在尝试在Hive中创建一个外部表,在BigQuery中创建另一个外部表,使用与Spark编写的Avro格式存储在Google存储中相同的数据 我正在使用带有Spark 2.2.0、Spark avro 4.0.0和Hive 2.1.1的Dataproc群集 Avro版本/软件包之间存在相同的差异,但如果我使用配置单元创建表,然后使用Spark编写文件,我就能够在配置单元中看到它们 但对于BigQuery则不同,它能够读取Hive Avro文件,但不能读取Spark Avro文件 错误: Th

我正在尝试在Hive中创建一个外部表,在BigQuery中创建另一个外部表,使用与Spark编写的Avro格式存储在Google存储中相同的数据

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

Avro版本/软件包之间存在相同的差异,但如果我使用配置单元创建表,然后使用Spark编写文件,我就能够在配置单元中看到它们

但对于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软件包,但我还没有发现哪一个与所有系统兼容

另外,我希望避免一些棘手的解决方案,比如在配置单元中创建一个临时表,然后使用
insert-into创建另一个表。。。选择*from…
我将编写大量数据,我希望避免使用此类解决方案


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

< P>错误消息由BigQueo使用的C++ AVro库抛出。Hive可能使用Java Avro库。C++库不喜欢用“.””.p/>开始命名空间。 这是库中的代码:

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

想知道你是否找到了答案


我看到了同样的情况,我正在尝试将数据加载到bigquery表中。库首先以avro格式将数据加载到GCS中。模式也有一个struct数组,带有

Spark avro的名称空间有另外一个选项
recordNamespace
来设置根名称空间,因此它不会从
开始


错误为“无效命名空间:.someField”。“.someField”是正确的全名吗?它是另一个名称,但它正是其中一个字段的名称。实际上,是结构字段数组的名称。Avro版本之间的模式定义似乎有些不同。很高兴知道,谢谢。但是问题仍然存在,你知道有没有办法让Spark Avro与BigQuery Avro兼容?你能把名称空间改成不以“.”开头吗?然后Spark和BigQuery都应该能够阅读它。我想,但我不能,我的领域没有“.”一开始,是Spark的Avro写的“.”我明白了。根据avro规范,听起来应该允许空名称空间:。因此,您可以向Avro库提交一个bug。您也可以在提交BigQuery问题。我没有找到它。目前,我正在以JSON格式编写数据,但我希望在某个时候将其更改为AVRO格式。