2016-04-20 8 views
1

が発生しました。Google BigQueryにはMarch 23, 2016 announcedが追加されました。「BigQuery APIまたはコマンドラインツールでの連合データソースとしての読み込み操作のAvroソース形式のサポートの追加」これはhereと表示されています "これはAvro形式のサポートのベータ版です。この機能はSLAまたは非推奨ポリシーの対象ではなく、後方互換性のない変更を受ける可能性があります。しかし、私はその機能が動作すると期待しています。AvroファイルをBigQueryにロードする際に内部エラー

Avroフォーマットの読み込み方法に関するコード例はどこにも見つかりませんでした。私はどのようにしてbq -toolを使ってロードするのかの例は見つけられませんでした。

私の実際的な問題です。 Avro形式のBigQueryにデータを読み込むことができませんでした。

bq -toolを使用すると、次のようなことが起こります。データセット、テーブル名とバケット名は難読化されています:

$ bq extract --destination_format=AVRO dataset.events_avro_test gs://BUCKET/events_bq_tool.avro Waiting on bqjob_r62088699049ce969_0000015432b7627a_1 ... (36s) Current status: DONE $ bq load --source_format=AVRO dataset.events_avro_test gs://BUCKET/events_bq_tool.avro Waiting on bqjob_r6cefe75ece6073a1_0000015432b83516_1 ... (2s) Current status: DONE BigQuery error in load operation: Error processing job 'dataset:bqjob_r6cefe75ece6073a1_0000015432b83516_1': An internal error occurred and the request could not be completed.

基本的に、私はテーブルから抽出し、内部エラーの原因と同じテーブルに挿入しています。

さらに、私は同じ結果(内部エラー)で同じ(テーブルXから抽出してテーブルXにロードする)Javaプログラムを持っています。しかし、私は、上記で問題をできるだけ明確に説明していると思います。そのため、私はここでコードを共有していません。 Javaでは、空のテーブルから抽出して挿入すると、挿入ジョブは失敗しません。

私の質問は、私はBigQueryのAPIは内部エラーで失敗することはありませんだと思う

  • です。なぜ私のテストでそれが起こっているのですか?
  • 抽出されたAvroファイルは挿入ジョブと互換性がありますか?
  • 挿入ジョブのAvroスキーマがどのようなものなのか、少なくとも私は何も見つけられませんでした。ドキュメントは作成できますか?これまでのところ、私はREQUIREDフィールドを使用していないのヒントに基づいて内部エラーを与えないアブロ負荷の仕事を得ることができた

は、2016年4月25日に更新しました。ただし、null以外の値をロードすることはできませんでした。

がこのアブロ・スキーマを考えてみましょう:

{ "type": "record", "name": "root", "fields": [ { "name": "x", "type": "string" } ] }

BigQueryのテーブルが1列、NULLABLEあるxを持っています。私は(私は1と2を試してみた)行(xは、例えば1である)Nを挿入した場合

、私はBigQueryの中でN行を得たが、xは常に値nullを持ちます。

XREQUIREDになるようにテーブルを変更すると、内部エラーが発生します。

答えて

0

BQスキーマからAvroスキーマへの完全一致はなく、その逆もあります。したがって、BQテーブルをAvroファイルにエクスポートしてからインポートすると、スキーマは異なります。あなたのロードのデスティネーションテーブルが既に存在することがわかります。この場合、デスティネーションテーブルのスキーマがAvroスキーマから変換したスキーマと一致しないときにエラーが発生します。これは外部エラーであるはずですが、内部エラーである理由を調べています。

エクスポートパイプラインのアップグレード中です。新しいインポートパイプラインには、現在のパイプラインによってエクスポートされたAvroファイルでは動作しないバグがあります。修正プログラムは数週間で導入する必要があります。その後、エクスポートされたファイルを存在しないデスティネーション・テーブルまたは互換性のあるスキーマを持つデスティネーション・テーブルにインポートすると、そのファイルは機能するはずです。一方、あなた自身のAvroファイルをインポートすることはうまくいくはずです。インポートすることなくGCS上で直接クエリを実行することもできます。

+1

要約:BigQueryにはバグがあります:Avroフォーマットを使用した挿入ジョブ_は、宛先テーブルが存在する場合には機能しません。ただし、内部エラーが発生します。回避策は、createDisposition 'CREATE_IF_NEEDED'を使用し、そこにテーブルを持たないことです。私はこの仕事を確認した。 – codeholic

0

ここでAVROリーダーのエラーマッピングに問題があります。「参照スキーマは既存のデータとは異なります:必要なフィールド 'api_key'がありません」

ロードジョブの設定を見ると、REQUIREDフィールドが表示されます。ロードしようとしているデータの中には、これらの必須フィールドが指定されていないため、操作が失敗するようです。

必要なフィールドを避けることをおすすめします。

+0

テーブルから抽出して_same_テーブルにロードします。スキーマの違いはどうやってできますか?新しい抽出ジョブID( 'bqjob_r5f53dd0ed50e561d_000001543e21186f_1')と対応するロードジョブID(' bqjob_r8db14d5e82c011d_000001543e21e8e0_1')があります。私はまた、抽出ファイルをダウンロードし、各行をチェックしました。それらはすべてフィールド 'api_key'を含んでいます。 Javaプログラムでは、1つの 'NULLABLE'カラム(' STRING')を持つシンプルなテーブルを作ることで進歩を遂げました。その表に1行をロードすると、1行ありますが、値はnullです。 – codeholic

0

BigQueryにバグがあります。宛先テーブルが存在する場合、Avroフォーマットを使用する挿入ジョブは機能しませんが、内部エラーが発生します。回避策は、createDispositionCREATE_IF_NEEDEDを使用し、そこに既存のテーブルを持たないことです。私はこれが動作することを確認しました。

Hua Zungのコメントによると、この修正プログラムは「修正プログラムを数週間で展開する」と修正されているという。言うまでもなく、ライブシステムの既存の大きなバグをどこかに記録する必要があります。

システムのアップデート中に、Avroのドキュメントを改善することをお勧めします。 Avroファイルの各レコードが宛先テーブルの行にマップされるという事実さえも、Avroスキーマがどのようなものであるべきかについては言及していません(タイプrecord、名前root、フィールド配列は?しかし、言及すべきである)。また、スキーマの不一致が発生した場合は文書化されていません。

助けてくれてありがとう、私は今Avroフォーマットに切り替えるでしょう。それはCSVよりずっと優れています。

+0

提案していただきありがとうございます。テクニカルライターにお渡しします。 –

関連する問題