2017-12-18 238 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。 –