我正在尝试在Hive中创建一个外部表,并在BigQuery中创建另一个表,使用与Spark编写的Avro格式存储在Google Storage中的相同数据。
我使用的是带有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包,但我还没有找到哪个包与所有系统都兼容。
此外,我想避免棘手的解决方案,如在配置单元中创建临时表,并使用insert into ... select * from ...创建另一个表,我将写入大量数据,我希望避免这种解决方案
任何帮助都将不胜感激。谢谢
发布于 2017-12-19 16:57:31
错误消息是由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_);
}发布于 2019-07-09 02:27:51
. -avro有额外的选项recordNamespace来设置根命名空间,所以它不会从Spark启动。
https://github.com/databricks/spark-avro/blob/branch-4.0/README-for-old-spark-versions.md
发布于 2018-01-09 10:56:23
想知道你是否找到了答案。
我看到了同样的事情,我试图将数据加载到bigquery表中。该库首先将数据以avro格式加载到GCS中。该模式也有一个结构数组,名称空间以一个.开头
https://stackoverflow.com/questions/47865688
复制相似问题