Невозможно вставить Pandas фреймы данных со значениями NaN (или None) в таблицы BigQuery при определении table_schema - PullRequest
1 голос
/ 23 февраля 2020

Я использую pandas_gbq.to_gbq() для экспорта DataFrame в Google BigQuery с col1, который имеет значение NULL.

>>>df
col1    day
apple   2019-03-01
None    2019-03-02
banana  2019-03-02
None    2019-03-03

>>>df.dtypes
col1   object
day    datetime64[ns]
dtype: object

Без определения схемы таблицы я могу успешно экспортировать таблицу в BigQuery со значением null в col1.

from google.cloud import bigquery
import pandas as pd
import pandas_gbq

pandas_gbq.to_gbq(df
        ,table_name
        ,project_id='project-dev'
        ,chunksize=None
        ,if_exists='replace'
        )

схема таблицы по умолчанию в BigQuery:

col1   STRING      NULLABLE
day    TIMESTAMP   NULLABLE

Однако, когда я пытаюсь определить day как тип DATE в BigQuery, так как я не хочу тип TIMESTAMP, я столкнулся ошибка (я пробовал NaN и None; оба столкнулись с ошибками).

table_schema = [{'name':'day', 'type':'DATE'}]

pandas_gbq.to_gbq(df
        ,table_name
        ,project_id='project-dev'
        ,chunksize=None
        ,if_exists='replace'
        ,table_schema=table_schema
        )

Сообщения об ошибках:

в df, файл table_schema = table_schema "/Users/xxx/anaconda3/lib/python3.6/site-packages/pandas_gbq/ gbq.py ", строка 1224, в to_gbq progress_bar = progress_bar, файл" /Users/xxx/anaconda3/lib/python3.6/site-packages/pandas_gbq/gbq.py ", строка 606, в load_data self.process_http_error (ex) Файл "/Users/xxx/anaconda3/lib/python3.6/site-packages/pandas_gbq/gbq.py", строка 425, в process_http_error вызывает GenericGBQException (формат "Reason: {0}". ex (ex )) pandas_gbq.gbq.GenericGBQException: Причина: 400 Ошибка при чтении данных, сообщение об ошибке: таблица CSV обнаружила слишком много ошибок, отказывает. Ряды: 1; ошибки: 1. Пожалуйста, обратитесь к коллекции ошибок [] для получения более подробной информации.

Я прочитал документацию pandas_gbq, но все еще не могу выяснить.

https://pandas-gbq.readthedocs.io/en/latest/api.html#pandas_gbq .to_gbq

Может ли кто-нибудь указать мне правильное направление? Спасибо.

1 Ответ

0 голосов
/ 27 февраля 2020

Я пишу этот ответ из предложения, которое я представил в разделе комментариев.

Согласно документации , если вы предоставите String в каноническом формате DATE , он будет читаться как DATE в BigQuery. Канонические форматы приведены ниже:

  • ГГГГ: Четырёхдневный git год

  • [M] M: Один или два ди git месяц

  • [D] D: Один или два ди git день

Следовательно, после изменения типа и формата, как описано выше, вы сможете определить свою схему так, как вам нужно, или BigQuery определит ее как DATE.

Как я упоминал в комментарии, я провел несколько тестов, чтобы подтвердить и проиллюстрировать то, что я предложил, я поделюсь этим кодом, чтобы еще больше помочь сообществу. Я использовал Jupyter Notebook на платформе AI для запуска приведенного ниже примера кода:

!pip install pandas_gbq

from google.cloud import bigquery 
import pandas as pd


table_schema = [{'name':'my_datetime', 'type':'DATE'},{'name':'my_string', 'type':'string'}]
df = pd.DataFrame(
    {
        "my_datetime": ["2020-01-01", "2020-01-01", "2020-01-01"],
        "my_string": ['a1',None, 'a3'],
    }
)

df.to_gbq(destination_table='data_frame.data_set', project_id='project_id', if_exists='replace')

Надеюсь, это поможет.

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