Получение IndexError: строковый индекс вне диапазона при загрузке файла в bigquery - PullRequest
1 голос
/ 23 января 2020

Я пытаюсь загрузить CSV-файл из моего хранилища Google в BigQuery. Там нет дополнительной процессии, просто простая операция загрузки. но его ошибка.

ниже приведен фрагмент кода:

 def bigquery_commit(element):

    from google.cloud import bigquery
    PROJECT = 'emerald-990'
    source = contact_options.output.get()
    client = bigquery.Client(project=PROJECT)
    dataset_ref = client.dataset('snow')
    table_ref = dataset_ref.table(source)
    table = client.get_table(table_ref)
    errors = client.insert_rows(table, element)
    print ("Errors occurred:", errors)

Ошибка

IndexError: string index out of range [while running 'FlatMap(bigquery_commit)']

основная функция:

options = PipelineOptions()
p = beam.Pipeline(options=options)
(p
 | 'Read from a File' >> beam.io.ReadFromText(contact_options.input, skip_header_lines=0)
 | beam.FlatMap(bigquery_commit))

p.run().wait_until_finish()

Теперь, когда Я сдаю тестовую запись напрямую, это работает. пример:

    rows_to_insert = [{u'id': 101, u'name': 'tom', u'salary': 99899}]
    errors = client.insert_rows(table, rows_to_insert)

Любая идея, чего мне не хватает.

Ответы [ 2 ]

1 голос
/ 24 января 2020

Я быстро замечаю здесь проблему в том, что ваши данные, поступающие с ReadFromText, имеют тип str, в то время как client.insert_rows принимает список элементов.

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

(p
 | 'Read from a File' >> beam.io.ReadFromText(contact_options.input, skip_header_lines=0)
 | beam.Map(lambda x: json.loads(x))  # Parse your JSON strings
 | apache_beam.io.gcp.bigquery.WriteToBigQuery(table=table_ref))

Теперь, Я не рекомендую следующий подход , но если вам действительно нужно исправить свой код, вы бы сделали:

def bigquery_commit(element):

    from google.cloud import bigquery
    PROJECT = 'emerald-990'
    source = contact_options.output.get()
    client = bigquery.Client(project=PROJECT)
    dataset_ref = client.dataset('snow')
    table_ref = dataset_ref.table(source)
    table = client.get_table(table_ref)
    parsed_element = json.loads(element)
    errors = client.insert_rows(table, [parsed_element])
    print ("Errors occurred:", errors)
0 голосов
/ 27 февраля 2020

Я получил то же сообщение об ошибке, но в несколько ином контексте. Я не смог найти ответы на свой вопрос, поэтому подумал о том, чтобы оставить здесь подсказку.

Отслеживание не сильно помогло:

File "/user_code/main.py", line 198, in execute
errors = client.insert_rows(table, row)

File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 2113, in insert_rows
json_rows = [_record_field_to_json(schema, row) for row in rows]

File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 2113, in <listcomp>
json_rows = [_record_field_to_json(schema, row) for row in rows]

File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/_helpers.py", line 415, in _record_field_to_json
record[subname] = _field_to_json(subfield, subvalue)

File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/_helpers.py", line 444, in _field_to_json
return _repeated_field_to_json(field, row_value)

File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/_helpers.py", line 386, in _repeated_field_to_json
values.append(_field_to_json(item_field, item))

File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/_helpers.py", line 447, in _field_to_json
return _record_field_to_json(field.fields, row_value)

File "/env/local/lib/python3.7/site-packages/google/cloud/bigquery/_helpers.py", line 414, in _record_field_to_json
subvalue = row_value[subindex]

IndexError: string index out of range

Я запускал скрипт, который вставлял строку в BigQuery в структуре с правильным порядком столбцов, значениями и типами данных . Сценарий выбрал соответствующий набор данных и таблицу. Если таблица не существует, то она создаст ее , и это было проблемой.

Во время создания таблицы я предоставил определенное количество столбцов в ее схеме, но вскоре после этого добавил еще два столбца в ее схему вместо прямого изменения структуры таблицы. Поэтому порядок столбцов был правильным, вставленные строки соответствовали типам данных, но таблица была создана не со всеми столбцами вставленной строки:

IndexError: string index out of range

Решением было удаление и воссоздав таблицу с нужной схемой . Это работает как шарм!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...