2017-12-18 22 views
1

私は、HiveとBigQueryで外部テーブルを作成しようとしていますが、AvroフォーマットでGoogle Storageに保存されているものと同じデータをSparkで書いています。Spark AVRO with BigQuery

私はハイブを使用してテーブルを作成する場合がありアブロバージョン/パッケージ間の同じ違いはあるが、

をスパーク2.2.0とDataprocクラスタを使用して、スパーク・アブロ4.0.0および2.1.1ハイブだし、 Sparkを使ってファイルを書き、私はHiveでそれらを見ることができます。

BigQueryは異なるため、Hive Avroファイルは読み取ることができますが、Spark Avroファイルは読み取ることができません。

エラー:

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

がエラーについて少し検索、問題は、Sparkアブロファイルはハイブ/ BigQueryのアブロファイルは異なっているということです。

私はこれを修正する方法を正確にはわかりませんが、おそらくSparkで異なるAvroパッケージを使用していますが、どのシステムがすべてのシステムと互換性があるかわかりません。また

ハイブに一時テーブルを作成し、別の私は多くのデータを書き込みますinsert into ... select * from ...を使用して作成し、私は解決策

すべてのヘルプは以下のようになり、この種のを避けたいように私はトリッキーなソリューションを避けたいです感謝。ありがとう

+0

エラーは「無効な名前空間:.someField」です。 ".someField"は正しいフルネームですか? http://avro.apache.org/docs/current/spec.html#names –

+0

これは別の名前ですが、正確にはフィールドの名前の1つです。実際、構造体フィールドの配列の名前です。 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用に変更したいと考えています。 –