#python #pandas #dataframe #google-bigquery
#питон #панды #фрейм данных #google-bigquery #python #pandas
Вопрос:
Я уже некоторое время пытаюсь загрузить данные из фрейма данных Pandas в таблицу BigQuery, но я продолжаю сталкиваться с новыми проблемами.
Я предпринимаю следующие шаги:
- Вызываю данные из API, и я присваиваю ответ переменной с именем:
result[]
. Эта переменная представляет собой список вложенных словарей. - Чтобы преобразовать этот список вложенных словарей во фрейм данных, я использую следующую команду (с разделением ‘_’:
new_df = json_normalize(result, sep='_')
- Результат выглядит хорошо, и кажется, что фрейм данных создан правильно со следующей информацией (см. Пункт 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 КБ
- Теперь пришло время загрузить фрейм данных в 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. Звучит круто :). Что касается наличия структур в вашей таблице, это может быть использовано как очень эффективный шаблон проектирования для ваших данных, особенно если вы объединяете их с массивами (это может значительно уменьшить размер данных, которые хранятся, запрашиваются и выставляются в ваших проектах).