2017-06-21 10 views
1

BigQueryスキーマ定義のドキュメントがどこにありますか?つまり、ファイルをアップロードするときに指定するJSONスキーマ(personsDataSchema.json in this example)です。BigQueryスキーマの定義/ドキュメント?

私は長年にわたりグーグルで働いていましたが、スキーマのスキーマに関するドキュメントは見つかりませんでした。

最も近いのはdocumentation about auto-detecting schemasです。しかし、それが適切ではなく、あらかじめ定義されたJSONスキーマを提供する必要がある場合は、どのフィールドが必須で、どの値が許可されているかについてのドキュメントはありますか?

+1

改行で区切られたJSONが基本であり、すべての通常のフィールド/タイプです。 https://stackoverflow.com/questions/41902054/json-schema-bigquery-what-would-my-schema-be-from-my-json-file-i-cannot-f –

+1

フィードバックをお寄せいただきありがとうございます。あなたは機能リクエストを作成しても構いませんか? https://issuetracker.google.com/issues/new?component=187149&template=0。 一方、APIのドキュメントを参照できます。たとえば、このリンクでは、テーブルのスキーマ(https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#schema)を定義します。 JSONの直接の定義ではありませんが、あなたはそれを理解することができます。 –

+0

@HuaZhangありがとう、私は問題を作成しました。 – Richard

答えて

4

スキーマを定義するには、基本的に、name,typeおよびmodeの3つのフィールドを定義するだけです。

テーブルの各フィールドにこれらの3つのキーが定義されている必要があります。あなたは、インスタンスのためのようなテーブルがある場合:

user_id source 
1   search 
2   email 

を次にスキーマは以下のように定義することができます

[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"}, 
{"name": "source", "type": "STRING", "mode": "NULLABLE"}] 

キーnameまさにそのような「USER_ID」として、フィールド名を記述します。

キーtypeは、STRING、INTEGER、FLOATなどのデータ型です。現在、BigQueryはthese typesをサポートしています。

  • STRING
  • INT64
  • のfloat64
  • BOOL
  • BYTES(encondingバイトがあなたの文字列表現を提供します)。
  • DATE
  • あなたがドキュメントを開いた場合DATETIME
  • TIME
  • TIMESTAMP
  • RECORD今

、あなたは私たちがまた繰り返されたデータ型ARRAYを持っていることがわかりますフィールド。私は後でそれらについてもっと議論するつもりです。

第3の鍵、modeに、これらのいずれかとすることができる:これは(

  • NULLABLE(値はNULLにすることができる)
  • REQUIRED(値はNULLにすることはできません)
  • を繰り返しますARRAYフィールドは、フィールドが基本的に値のリストであることを意味します)。

これまでの例を考えて、繰り返しフィールドを追加してみましょう。

user_id source wishlist 
1   search ["sku 0", "sku 1"] 
2   email  [] 
3   direct ["sku 0", "sku 3"] 

次のようにスキーマを定義することができます:

[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"}, 
{"name": "source", "type": "STRING", "mode": "NULLABLE"}, 
{"name": "wishlist", "type": "STRING", "mode": "REPEATED"}] 

そしてそこにあなたがそれ、文字列値の繰り返しとして定義される配列フィールドを持って説明する電子、ARRAYフィールド)。

これは、1つのタイプのフィールドが残っており、これはRECORDフィールド(STRUCT)です。これらは基本的には同じですが、第4のキーとしてfieldsが定義されています。 RECORDには他のフィールドが含まれているので、その定義も記述する必要があります。これは、例を理解することは容易である:countrycity

ここ
user_id source wishlist   location.country location.city 
1   search ["sku 0", "sku 1"] USA     NY 
2   email  []     USA     LA 
3   direct ["sku 0", "sku 3"] BR     SP 

locationは2内のキーのレコード(構造体)です。そのためにスキーマを定義する方法は次のとおりです。

[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"}, 
{"name": "source", "type": "STRING", "mode": "NULLABLE"}, 
{"name": "wishlist", "type": "STRING", "mode": "REPEATED"}, 
{"name": "location", "type": "RECORD", "mode": "NULLABLE", "fields": [{"name": "country", "type": "STRING", "mode": "NULLABLE"}, {"name": "city", "type": "STRING", "mode": "NULLABLE"}]}] 

RECORDSのREPEATEDフィールドが必要ですか?もちろん!あなたのクライアントは、インスタンスのためにあなたのウェブサイトに持っていた各hitについて繰り返しフィールドが必要な場合は、そのようにスキーマを定義することができます。

[{"name": "user_id", "type": "INT64", "mode": "REQUIRED"}, 
{"name": "source", "type": "STRING", "mode": "NULLABLE"}, 
{"name": "wishlist", "type": "STRING", "mode": "REPEATED"}, 
{"name": "location", "type": "RECORD", "mode": "NULLABLE", "fields": [{"name": "country", "type": "STRING", "mode": "NULLABLE"}, {"name": "city", "type": "STRING", "mode": "NULLABLE"}]}, 
{"name": "hit", "type": "RECORD", "mode": "REPEATED", "fields": [{"name": "hitNumber", "type": "INT64", "mode": "NULLABLE"}, {"name": "hitPage", "type": "STRING", "mode": "NULLABLE"}]}] 

すべてのことを考えると、我々は最終的にdataPersons.jsonスキーマを定義するだろうか、あなたの質問に答えることができます?

これはpersonsDataの行の例です。

{"kind": "person", 
"fullName": "John Doe", 
"age": 22, 
"gender": "Male", 
"phoneNumber": {"areaCode": "206", "number": "1234567"}, 
"children": [{"name": "Jane", "gender": "Female", "age": "6"}, 
       {"name": "John", "gender": "Male", "age": "15"}], 
"citiesLived": [{"place": "Seattle", "yearsLived": ["1995"]}, 
       {"place": "Stockholm", "yearsLived": ["2005"]}]} 

まず、我々は"kind": "person"を持っています。これは容易であり、そのスキーマは次のようになります

{"name": "kind", "type": "STRING", "mode": "REQUIRED" or "NULLABLE"} 

phoneNumberは、2つの内側のフィールド、areaCodenumberとRECORD(STRUCT)フィールドです。さて、私たちはすでにそれらを定義する方法を見ました!

{"name": "phoneNumber", 
"type": "RECORD", 
"mode": "NULLABLE OR REQUIRED", 
"fields": [{"name": "areaCode", "type": "INT64", "mode": "NULLABLE"}, 
      {"name": "number", "type": "INT64", "mode": "NULLABLE"}]} 

childrencitiesLivedはつまり、彼らは両方のレコードの反復(ARRAY)フィールド(構造体)は、同じ定義を有します。私たちの最後の例のように、これも簡単なものでなければなりません。 citiesLivedは次のように定義されます:

{"name": "citiesLived", 
"type": "RECORD", 
"mode": "REPEATED", 
"fields": [{"name": "place", "type": "STRING", "mode": "NULLABLE"}, 
      {"name": "yearLived", "type": "INT64", "mode": "REPEATED"}]} 

あなたが持っています。それは基本的にスキーマ定義のすべてです。たとえば、Pythonを使用している場合、そのアイデアは同じです。あなたはそうのように、各フィールドを定義するクラスSchemaFieldをインポートします。

from google.cloud.bigquery import SchemaField 
field_kind = SchemaField(name="kind", type="STRING", mode="NULLABLE") 

他のクライアントが同じ考えに従います。

要約すると、表の各フィールドには、常にname,typeおよびmodeの3つのキーを定義する必要があります。フィールドのタイプがRECORDの場合は、fieldsを定義する必要があります。また、各内部フィールドに対して、3つのキー(内部フィールドのタイプがRECORDの場合は4)を再度定義します。

これにより、スキーマの定義方法が少し明確になりました。この件に関するご質問がある場合はお知らせください。回答を更新します。

+0

偉大な答え!追加するべき小さなものは、デフォルトモードがNULLABLEなので、あなたが怠惰であると感じるとき、NULLABLEフィールドのモードをスキップすることができます。 –

関連する問題