スキーマを定義するには、基本的に、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には他のフィールドが含まれているので、その定義も記述する必要があります。これは、例を理解することは容易である:country
とcity
:
ここ
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つの内側のフィールド、areaCode
とnumber
とRECORD(STRUCT)フィールドです。さて、私たちはすでにそれらを定義する方法を見ました!
{"name": "phoneNumber",
"type": "RECORD",
"mode": "NULLABLE OR REQUIRED",
"fields": [{"name": "areaCode", "type": "INT64", "mode": "NULLABLE"},
{"name": "number", "type": "INT64", "mode": "NULLABLE"}]}
今children
とcitiesLived
はつまり、彼らは両方のレコードの反復(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)を再度定義します。
これにより、スキーマの定義方法が少し明確になりました。この件に関するご質問がある場合はお知らせください。回答を更新します。
改行で区切られたJSONが基本であり、すべての通常のフィールド/タイプです。 https://stackoverflow.com/questions/41902054/json-schema-bigquery-what-would-my-schema-be-from-my-json-file-i-cannot-f –
フィードバックをお寄せいただきありがとうございます。あなたは機能リクエストを作成しても構いませんか? https://issuetracker.google.com/issues/new?component=187149&template=0。 一方、APIのドキュメントを参照できます。たとえば、このリンクでは、テーブルのスキーマ(https://cloud.google.com/bigquery/docs/reference/rest/v2/tables#schema)を定義します。 JSONの直接の定義ではありませんが、あなたはそれを理解することができます。 –
@HuaZhangありがとう、私は問題を作成しました。 – Richard