2017-12-18 161 views
1

我试图在Hive中创建一个外部表,并使用存储在Avro格式的Google存储中的相同数据在BigQuery中创建另一个表。Spark与AVI兼容BigQuery

我使用的是Dataproc集群星火2.2.0,星火的Avro 4.0.0和2.1.1蜂房

有Avro的版本/包之间的差异一样,但如果我创建使用蜂巢表和然后我使用Spark编写文件,我可以在Hive中看到它们。

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

错误:

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

搜索一些关于错误,问题是,星火Avro的文件是从蜂巢/ BigQuery的Avro的文件不同。

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

我也想避免棘手的解决方案,如创建蜂巢临时表和另一个使用insert into ... select * from ...我会写很多数据的创建,我想避免这种解决方案

任何帮助将是赞赏。谢谢

+0

错误是“Invalid namespace:.someField”。 “.someField”是正确的全名吗? http://avro.apache.org/docs/current/spec.html#names –

+0

这是另一个名字,但它正是其中一个字段的名称。实际上,是一个Struct的字段数组的名称。似乎Avro版本之间的架构定义有些不同。 –

回答

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_); 
} 
+0

很高兴知道,谢谢。但问题仍然存在,你知道是否有某种方法可以使Spark Avro与BigQuery Avro兼容? –

+0

你可以将命名空间更改为不以“。”开头吗?然后Spark和BigQuery都应该可以读取它。 –

+0

我想但我不能,我的领域没有“。”起初,Spark的Avro正在写这篇文章。“ –

0

想知道如果你找到了答案。

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

+0

我没有找到它。目前我正在以JSON格式写入数据,但我想在某些时候将其更改为AVRO。 –