spark avro兼容bigquery

polhcujo  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(389)

我尝试在hive中创建一个外部表,在bigquery中创建另一个外部表,使用的数据与使用spark编写的avro格式存储在google存储中的数据相同。
我使用的是带有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 ... 我会写很多数据,我想避免这种解决方案
任何帮助都将不胜感激。谢谢

rt4zxlrg

rt4zxlrg1#

spark avro还有其他选择 recordNamespace 设置根命名空间,因此它不会从 . .
https://github.com/databricks/spark-avro/blob/branch-4.0/readme-for-old-spark-versions.md

iezvtpos

iezvtpos2#

想知道你是否找到了答案。
我看到了同样的情况,我正在尝试将数据加载到bigquery表中。库首先以avro格式将数据加载到gcs中。模式也有一个struct数组,名称空间有一个 .

6rvt4ljy

6rvt4ljy3#

错误消息由bigquery使用的cavro库抛出。hive可能使用javaavro库。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_);
}

相关问题