2017-02-11 19 views
2

Так я пытаюсь следовать этому примеру: http://ajkannan.github.io/gcloud-python/latest/bigquery-usage.htmlнеожиданное ключевое слово аргумент «тип» для BigQuery

Но когда я пытаюсь создать таблицу:

import os 
import subprocess 
import sys 
from gcloud.bigquery import SchemaField 
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "toto.json" 
os.environ['GCLOUD_PROJECT'] = 'titi' 
from gcloud import pubsub 

client = pubsub.Client('titi') 

# Imports the Google Cloud client library 
from google.cloud import bigquery 

# Instantiates a client 
bigquery_client = bigquery.Client() 

# The name for the new dataset 
dataset_name = 'tata' 

dataset = bigquery_client.dataset(dataset_name) 
table = dataset.table(name='aspire_page') 

table.schema = [ 
    SchemaField(name= 'id', type= 'int', mode= 'nullable'), 
    SchemaField(name= 'zip', type= 'string', mode= 'nullable'), 
    SchemaField(name= 'html', type= 'string', mode= 'nullable'), 
     SchemaField(name= 'url', type= 'string', mode= 'nullable'), 
     SchemaField(name= 'categorie', type= 'string', mode= 'nullable'), 
    SchemaField(name= 'date', type= 'string', mode= 'nullable'), 
    SchemaField(name='name', type= 'string', mode= 'nullable'), 

] 


table.create() 

У меня есть:

TypeError         Traceback (most recent call last) 
<ipython-input-10-30edba459053> in <module>() 
    23 
    24 table.schema = [ 
---> 25  SchemaField(name= 'id', type= 'int', mode= 'nullable'), 
    26  SchemaField(name= 'zip', type= 'string', mode= 'nullable'), 
    27  SchemaField(name= 'html', type= 'string', mode= 'nullable'), 

TypeError: __init__() got an unexpected keyword argument 'type' 

И я не понимаю, зачем SchemaField нужен тип для инициализации ...

Если кто-то есть идея

Спасибо и привет

редактировать:

Даже @ andre622 не работают:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-1-f177aa490fbb> in <module>() 
    29 SchemaField('categorie', 'STRING', mode= 'nullable'), 
    30 SchemaField('date', 'STRING', mode= 'nullable'), 
---> 31 SchemaField('name', 'STRING', mode= 'nullable'), 
    32 ] 
    33 

/usr/local/lib/python3.5/dist-packages/google/cloud/bigquery/table.py in schema(self, value) 
    113   """ 
    114   if not all(isinstance(field, SchemaField) for field in value): 
--> 115    raise ValueError('Schema items must be fields') 
    116   self._schema = tuple(value) 
    117 

ValueError: Schema items must be fields 

Даже нику предложение:

import os 
import subprocess 
import sys 
from gcloud.bigquery import SchemaField 
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "toto.json" 
os.environ['GCLOUD_PROJECT'] = 'titi' 
from gcloud import pubsub 

client = pubsub.Client('titi') 

# Imports the Google Cloud client library 
from google.cloud import bigquery 

# Instantiates a client 
bigquery_client = bigquery.Client() 

# The name for the new dataset 
dataset_name = 'choual' 

# Prepares the new dataset 
dataset = bigquery_client.dataset(dataset_name) 
table = dataset.table(name='aspire_page') 

table.schema = [ 
    SchemaField('id','INTEGER'), 
    SchemaField('zip', 'STRING'), 
    SchemaField('html', 'STRING'), 
    SchemaField('url', 'STRING'), 
    SchemaField('categorie', 'STRING'), 
    SchemaField('date', 'STRING'), 
    SchemaField('name', 'STRING') 
] 


table.create() 

Я получил эту ошибку:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-3-191573ca7711> in <module>() 
    29  SchemaField('categorie', 'STRING'), 
    30  SchemaField('date', 'STRING'), 
---> 31  SchemaField('name', 'STRING') 
    32 ] 
    33 

/usr/local/lib/python3.5/dist-packages/google/cloud/bigquery/table.py in schema(self, value) 
    113   """ 
    114   if not all(isinstance(field, SchemaField) for field in value): 
--> 115    raise ValueError('Schema items must be fields') 
    116   self._schema = tuple(value) 
    117 

ValueError: Schema items must be fields 

ответ

1

Взятые из github источника, SchemaField не принимает type, он принимает field_type, это то, что вызвало вашу ошибку до @ andre622-х внушения:

(Заметьте, что я . не написать следующий код Весь код принадлежит компании Google Inc. по лицензии Apache 2)

"""Describe a single field within a table schema. 
:type name: str 
:param name: the name of the field. 
:type field_type: str 
:param field_type: the type of the field (one of 'STRING', 'INTEGER', 
         'FLOAT', 'BOOLEAN', 'TIMESTAMP' or 'RECORD'). 
:type mode: str 
:param mode: the type of the field (one of 'NULLABLE', 'REQUIRED', 
       or 'REPEATED'). 
:type description: str 
:param description: optional description for the field. 
:type fields: list of :class:`SchemaField`, or None 
:param fields: subfields (requires ``field_type`` of 'RECORD'). 
""" 
def __init__(self, name, field_type, mode='NULLABLE', description=None, 
      fields=None): 
    self.name = name 
    self.field_type = field_type 
    self.mode = mode 
    self.description = description 
    self.fields = fields 

Как вы используете режим по умолчанию, вы должны быть в состоянии использовать:

table.schema = [ 
    SchemaField('id','INTEGER'), 
    SchemaField('zip', 'STRING'), 
    SchemaField('html', 'STRING'), 
    SchemaField('url', 'STRING'), 
    SchemaField('categorie', 'STRING'), 
    SchemaField('date', 'STRING'), 
    SchemaField('name', 'STRING') 
] 

А почему он нужен тип, как еще было бы знать, какой тип данных, которые вы хотите хранить в этой области, в СУБД это позволяет правильное распределение пространства для каждого поля, как строка будет занимать определенный количество байтов. Это позволяет случайному доступу, зная, где находится первая строка и насколько велика каждая строка.

EDIT:

Вы можете попробовать вместо:

table = dataset.table('aspire_page', [ 
     SchemaField('id','INTEGER'), 
     SchemaField('zip', 'STRING'), 
     SchemaField('html', 'STRING'), 
     SchemaField('url', 'STRING'), 
     SchemaField('categorie', 'STRING'), 
     SchemaField('date', 'STRING'), 
     SchemaField('name', 'STRING') 
    ]) 

попробовать также с bigquery.SchemaField вместо просто SchemaField, вы можете иметь имя столкновения после импорта SchemaField из gcloud.bigquery и от google.cloud.bigquery.

+0

Я пробовал с вашим предложением и отредактировал свой вопрос, и nope не работает Спасибо за ваше время :) – user462794

+0

@ user462794 см. Редактировать –

+0

это сработало спасибо – user462794

0

Вам не нужно указывать ключи для первых двух пар ключ-значение, которые вы передаете в определение таблицы. Кроме того, ваши определения типов данных должны соответствовать тому, как BigQuery должен их глотать. Ваша схема должна быть определена как

table.schema = [ 
SchemaField('id', 'INTEGER', mode= 'nullable'), 
SchemaField('zip', 'STRING', mode= 'nullable'), 
SchemaField('html', 'STRING', mode= 'nullable'), 
    SchemaField('url', 'STRING', mode= 'nullable'), 
    SchemaField('categorie', 'STRING', mode= 'nullable'), 
SchemaField('date', 'STRING', mode= 'nullable'), 
SchemaField('name', 'STRING', mode= 'nullable'), 
] 
+0

Я тоже пробовал, но нет:/ – user462794

 Смежные вопросы

  • Нет связанных вопросов^_^