Фрейм данных Pandas для BigQuery вызывает NotImplementedError

#python #pandas #dataframe #google-bigquery

#питон #панды #фрейм данных #google-bigquery #python #pandas

Вопрос:

Я уже некоторое время пытаюсь загрузить данные из фрейма данных Pandas в таблицу BigQuery, но я продолжаю сталкиваться с новыми проблемами.

Я предпринимаю следующие шаги:

  1. Вызываю данные из API, и я присваиваю ответ переменной с именем: result[] . Эта переменная представляет собой список вложенных словарей.
  2. Чтобы преобразовать этот список вложенных словарей во фрейм данных, я использую следующую команду (с разделением ‘_’: new_df = json_normalize(result, sep='_')
  3. Результат выглядит хорошо, и кажется, что фрейм данных создан правильно со следующей информацией (см. Пункт 4)
  4. класс ‘pandas.core.frame.Ранжированный индекс фрейма данных: 833 записи, столбцы от 0 до 832: 137 записей, card_billing_addr1 для subscription_updated_at с dtypes: bool(4), float64(17), int64(17), object(99) использование памяти: более 868.9 КБ

  5. Теперь пришло время загрузить фрейм данных в BigQuery, вместо использования инструмента pandas-gbq я использую официальную документацию cloud и пытаюсь загрузить фрейм данных, используя следующие строки кода:
 client = bigquery.Client()
dataset_ref = client.dataset('dataset_name')
table_ref = dataset_ref.table('table_name')

client.load_table_from_dataframe(new_df, table_ref).result()
  

После этого я продолжаю получать ошибку:

 NotImplementedError: struct<key_1: string, key_2: string, ..., key_n: int64,>
  

Я понятия не имею, с чего начать, чтобы решить эту проблему. У кого-нибудь есть исправление или, может быть, лучшее предложение о том, как подойти к этому?

Комментарии:

1. json_normalizer Из pandas данные сглаживаются (поэтому вложенные структуры становятся плоскими строками); если ваша схема таблицы структурирована для получения, structs тогда она действительно сломается. Может быть, вы могли бы попробовать загрузить result непосредственно в BQ вместо того, чтобы использовать его как фрейм данных раньше.

2. хорошая мысль, единственная причина, по которой я использовал pandas, заключается в том, что я думал, что мне нужно получить все в формате таблицы перед загрузкой. Прямо сейчас я записываю result непосредственно в файл JSON с with open('data.json', 'w') as fp: json.dump(result, fp) однако загрузка файла в BQ приводит к ошибке Ошибка при чтении данных, сообщение об ошибке: не удалось проанализировать JSON: объект не найден при запуске нового массива.; есть предложения о том, как действовать дальше?

3. Похоже, на json.dump шаге произошла какая-то ошибка. Может быть, попробуйте создать новый файл только с первой строкой 'data.json' и попытаться выполнить отладку оттуда.

4. Не могли бы вы добавить обратную трассировку ошибки?

5. Звучит круто :). Что касается наличия структур в вашей таблице, это может быть использовано как очень эффективный шаблон проектирования для ваших данных, особенно если вы объединяете их с массивами (это может значительно уменьшить размер данных, которые хранятся, запрашиваются и выставляются в ваших проектах).