2016-03-21 9 views
2

JSONフォーマット(名前、タイプ、モード属性)で定義され、ファイルに格納されている、些細なテーブルスキーマ(ネストされたフィールドと繰り返しフィールドを含む)を持っています。 bq loadコマンドを使用してbigqueryテーブルを生成するために使用されています。BigQuerySinkのJSONテーブルスキーマからbigquery.TableSchemaへ

しかし、私はデータフローのPython SDKとBigQuerySinkで同じことをしようとすると、schema引数は'name':'type'要素のカンマ区切りのリスト、またはbigquery.TableSchemaオブジェクトのいずれかである必要があります。

JSONスキーマをbigquery.TableSchemaに取得する便利な方法はありますか、それともname:valueリストに変換する必要がありますか?

答えて

6

現在は、JSONスキーマを直接指定することはできません。カンマで区切られたフィールドのリストを含む文字列、またはbigquery.TableSchemaオブジェクトとしてスキーマを指定する必要があります。

スキーマが複雑で、ネストされたフィールドおよび/または繰り返しフィールドを含む場合は、bigquery.TableSchemaオブジェクトを作成することをお勧めします。

例はbigquery.TableSchemaのネストされたフィールドと繰り返しフィールドです。

from apitools.clients import bigquery 

table_schema = bigquery.TableSchema() 

# ‘string’ field 
field_schema = bigquery.TableFieldSchema() 
field_schema.name = 'fullName' 
field_schema.type = 'string' 
field_schema.mode = 'required' 
table_schema.fields.append(field_schema) 

# ‘integer’ field 
field_schema = bigquery.TableFieldSchema() 
field_schema.name = 'age' 
field_schema.type = 'integer' 
field_schema.mode = 'nullable' 
table_schema.fields.append(field_schema) 

# nested field 
field_schema = bigquery.TableFieldSchema() 
field_schema.name = 'phoneNumber' 
field_schema.type = 'record' 
field_schema.mode = 'nullable' 

area_code = bigquery.TableFieldSchema() 
area_code.name = 'areaCode' 
area_code.type = 'integer' 
area_code.mode = 'nullable' 
field_schema.fields.append(area_code) 

number = bigquery.TableFieldSchema() 
number.name = 'number' 
number.type = 'integer' 
number.mode = 'nullable' 
field_schema.fields.append(number) 
table_schema.fields.append(field_schema) 

# repeated field 
field_schema = bigquery.TableFieldSchema() 
field_schema.name = 'children' 
field_schema.type = 'string' 
field_schema.mode = 'repeated' 
table_schema.fields.append(field_schema) 
+0

ありがとうございます!私はちょうどPython SDKがアルファであることに気付いたので、それが少し成熟するまで、さらなる問題を[github](https://github.com/GoogleCloudPlatform/DataflowPythonSDK)に指示します。 – ivarg

2

私は同じ問題を抱えていました。私の場合は、すでにスキンを自動的に生成してjqusonをbigqueryにロードしました。

は、だから私は、自動生成されたschemawithにコマンドを取得することができた:

bq show --format prettyjson my-gcp-project:my-bq-table |jq .schema > my-bq-table.json 

スキーマは、このスニペットでbigquery.TableSchemaに変換することができ

from apache_beam.io.gcp.internal.clients import bigquery 


def _get_field_schema(**kwargs): 
    field_schema = bigquery.TableFieldSchema() 
    field_schema.name = kwargs['name'] 
    field_schema.type = kwargs.get('type', 'STRING') 
    field_schema.mode = kwargs.get('mode', 'NULLABLE') 
    fields = kwargs.get('fields') 
    if fields: 
     for field in fields: 
      field_schema.fields.append(_get_field_schema(**field)) 
    return field_schema 


def _inject_fields(fields, table_schema): 
    for field in fields: 
     table_schema.fields.append(_get_field_schema(**field)) 


def parse_bq_json_schema(schema): 
    table_schema = bigquery.TableSchema() 
    _inject_fields(schema['fields'], table_schema) 
    return table_schema 

それはのBigQuery JSONスキーマで動作しますもしあなたが私のような怠け者であるなら、デフォルトでヌル文字列であるフィールドに満足すれば、typemodeを指定するのを避けることができます。

+1

ありがとうございました!また、BIgQuery UIでテーブルを作成するためにスキーマが必要な場合(たとえば、パーティションテーブルを手動で作成する必要がある場合)、 'schema'フィールドで' fields'キーを選択することを忘れないでください: 'bq show --format prettyjson my-gcp-project:my-bq-table | jq '.schema.fields'> my-bq-table.json' – Guille