2017-06-13 8 views
0

私はGoogle BigQueryのPythonクライアントで作業しています。 私はテーブルの作成/エクスポートを自動化するプログラムを書いています。python - 文字列をフィールドオブジェクトに割り当てる

すべてうまくいきますが、少し問題があります。ユーザーの入力として表のスキーマを取りたいと思います。

は、ここでテーブルスキーマが現在割り当てられている方法は次のとおりです。これは、コード内でハードコードされます

table.schema = (
    bigquery.SchemaField('Name', 'STRING'), 
    bigquery.SchemaField('Gender', 'STRING'), 
    bigquery.SchemaField('Frequency', 'INTEGER') 
) 

ユーザー入力を処理し、上記の形式に変換するコードを記述しました。私はというエラーを取得する今

bigquery.SchemaField(Name, STRING),bigquery.SchemaField(Gender, STRING),bigquery.SchemaField(Frequency, INTEGER) 

私はテーブルのスキーマにこの文字列を代入しようとすると、

table.schema = (bq_schema) 

: - bq_schema - のように見える

は何私のコードを返すことは文字列です。 Schema items must be fields

したがって、ユーザーの入力に応じてテーブルスキーマを動的にするにはどうすればよいですか。

EDIT:要求されたとして、文字列にユーザー入力を変換するため、ここでのコード:

s_raw = raw_input('\n\nEnter the schema for the table in the following format- fieldName:TYPE, anotherField:TYPE\n') 
s = s_raw.split(',') 
schema = [] 

for obj in s: 
    temp = obj.split(':') 
    schema.append(temp[0]) 
    schema.append(temp[1]) 

bq_schema = '' 

for i in range(0, len(schema), 2): 
    bq_schema+=('bigquery.SchemaField(\'{}\', \'{}\'),'.format(schema[i], schema[i+1])) 
+0

あなたのコードの戻り値が実際に文字列にすることはできません。スキーマの「setterプロパティ」はhttps://github.com/GoogleCloudPlatform/google-cloud-python/blob/master/bigquery/google/cloud/bigquery/table.py#L106で定義されているため、すべてのフィールドは 'SchemaField'のインスタンスなので、' SchemaField'以外の値は返しません。あなたのシステムにユーザーが入力したものの例がありますか?この入力を以前に言及した文字列に変換する方法を教えてください。 –

+0

助けてくれてありがとう! 私はOPにコードを追加しました – noobcoder

答えて

0

質問:どのような私のコードが返されますが、文字列である - bq_schemaあなたは何

対面は__str__bigqueryオブジェクトのrepresantation。

変更以下:

bq_schema = [] 
for i in range(0, len(schema), 2): 
    bq_schema.append(SchemaField(schema[i], schema[i+1])) 
1

フィールドでは、基本的に3 inputs必要BigQueryの中でどのように動作するかを定義するには:nametypemodeを。

入力スキーマを処理する際に、RECORDのフィールドを管理する際には、それらのフィールドのそれぞれに他のフィールドが定義されているため、1つの問題があります。

このような場合、ユーザーが作業しているスキーマ設定を文字列で入力することはやや難しくなります。

私がお勧めするのは、対応するスキーマを持つ入力データのようなJSONを受け取ることです。たとえば、これを入力として受け取ることができます。

このJSONはスキーマを完全にはっきりと定義しています。フィールド "category"は "RECORD"タイプで、子フィールドのそれぞれのスキーマ定義、つまり "name"と "id"を含んでいます。

Pythonでは、このJSONを処理するだけで済みます。この機能は、トリック行う可能性があります:

from google.cloud.bigquery import SchemaField 
def get_schema_from_json(input_json, res=[]): 
    if not input_json: 
     return res 
    cur = input_json.pop() 
    res.append(SchemaField(name=cur['name'], field_type=cur['type'], mode=cur['mode'], fields = None if 'fields' not in cur else get_schema_from_json(cur['fields'], []))) 
    return get_schema_from_json(input_json, res) 

をそして、あなたはちょうどそうのようなスキーマを抽出することができます。

table.schema = get_schema_from_json(user_json_input_data) 
関連する問題