2016-04-26 19 views
3

Avroをインポート形式として使用して簡単なテーブルを作成する際に問題があります。私は、N列のプリミティブデータ型(例えば、c1 STRINGc2 INTEGERという列のテーブル)を持つ典型的なテーブルを作成したいと考えています。私はこのAvroを使用して複数の列を含む行をBigQueryに挿入

{ 
    "type": "record", 
    "name": "x", 
    "fields": [ 
     { 
      "name": "c1", 
      "type": "string" 
     }, 
     { 
      "name": "c2", 
      "type": "int" 
     } 
    ] 
} 

ようなスキーマを使用

これはc1c2をネスト有するタイプRECORDの名前rootと一つの列に生じます。

Avroで2つのカラムc1c2を持つテーブルにインポートするにはどうすればよいですか?または、固定名がrootの1つの列を持つテーブルのみを作成することは現在可能ですか?

Iは、他のアプローチを試みた:(stringの)

  • アブロタイプarray{"type":"string"}root
  • STRING REPEATEDタイプの最も単純なスキーマタイプ STRINGの名前 rootとつの列を作成する名前を持つ1列を作成します。この方法では、複数の列を作成することも、列の名前を変更することもできません。

答えて

0

フィードバックをいただきありがとうございます。 Avroスキーマは常に、名前のない列から始まります。これは、文字列のようなプリミティブ型、またはレコードのような複雑な型になります。これをBQの列にマップし、名前を「root」に固定します。これが一般的な要求になる場合、囲みレコードをルートレベルでストライピングすることを検討します。しかし、次に、他のタイプとは異なるレコードタイプを処理しています。

解決策は、ルートレコードをクエリで削除し、別のテーブルに保存することです。または、フェデレーテッド・テーブルを使用してロードとストリップを1つのステップで結合することができます。

bq query --external_table_definition = foo :: AVRO = gs://your_bucket/path/file.avro* --destination_table your_dataset.your_table " SELECT root。* FROM foo "

+1

私は、JSONとAvroが同じ機能を持ち、スペース消費の点では良いフォーマットではないJSONの代わりにAvroを使用できると想定しました。これは事実ではありません(少なくとも今のところは)、Avroには任意の列名を使用できないというこの制限があります。私の場合、私たちの処理パイプラインは列に特定の名前があることを期待していますが、暗黙の 'root_'接頭辞のためにこれを達成できません。 IMHOエンドユーザーが自由に列に名前を付けることができる分析データベースの有効なユーザー要件です。今後この機能をサポートし、現在の機能を文書化してください。 – codeholic

+1

これまでのところ、ルートのものがあります - それは全く役に立たず、プロモーションされた機能で時間の無駄です!ユーザーがスキーマを完全に制御できるようにルートレコードを削除する計画はありますか? –

関連する問題