Я пытаюсь скопировать pandas фрейм данных в таблицу BigQuery, используя sqlalchemy (и pybigquery за кулисами). Тем не менее, я получаю сообщение об ошибке, потому что sqlalchemy пытается создать столбец типа BIGINT
, но BigQuery распознает только INT64
.
Вот некоторый код для воспроизведения ошибки:
import sqlalchemy as sqa, pandas as pd
db_engine = sqa.create_engine('bigquery://my-project/my_dataset', echo=True)
df = pd.DataFrame({'a': [1, 2], 'b': ['red', 'green']})
df.to_sql('test', db_engine, if_exists='replace', index=False)
Это отправляет следующий код SQL в BigQuery:
CREATE TABLE `test` (
`a` BIGINT,
`b` STRING
)
Это приводит к ошибке: Type not found: BIGINT
.
Странно, если я явно укажу, что столбец a
должен быть рассматривается как целое число (добавляя dtype={'a': sqa.types.Integer, 'b': sqa.types.String}
в последнюю строку), затем sqlalchemy просит BigQuery создать столбец INT64
, и все работает нормально. Но я бы не стал жестко кодировать тип данных для каждого столбца.
Это мне кажется ошибкой либо в Pandas, либо в sqlalchemy. Я пытался диагностировать это, но заблудился в их коде. Кто-нибудь знает изящный способ обойти эту проблему, или знает, где я могу точно определить ошибку, чтобы создать запрос на извлечение?