Как использовать новый объект Int64 pandas при сохранении в файл паркета - PullRequest
1 голос
/ 03 июня 2019

Я конвертирую данные из CSV в Parquet, используя Python (Pandas), чтобы позже загрузить их в Google BigQuery.У меня есть несколько целочисленных столбцов, которые содержат пропущенные значения, и, начиная с Pandas 0.24.0, я могу хранить их как Int64 dtype.

Есть ли способ использовать Int64 dtype также в файле паркета?Я не могу найти чистое решение для целых с отсутствующими значениями (поэтому они остаются как INTEGER в BigQuery).

Я попытался импортировать его непосредственно в BigQuery и получил ту же ошибку, что и при преобразовании в паркет с использованием Pandas (как показано ниже.)

Импортировать CSV со столбцом int, в котором отсутствует пропущенное значение:

import pandas as pd
df = pd.read_csv("docs/test_file.csv")
print(df["id"].info())

id 8, отличное от null float64

Строка импортируется как float64.Я изменяю тип на Int64:

df["id"] = df["id"].astype('Int64')
print(df["id"].info())

id 8 ненулевой Int64

Затем я пытаюсь сохранить паркет:

df.to_parquet("output/test.parquet")

Ошибка:

pyarrow.lib.ArrowTypeError: ('Не передан объект numpy.dtype', 'Преобразование не удалось для идентификатора столбца с типом Int64')

1 Ответ

1 голос
/ 04 июня 2019

В настоящее время существует открытая проблема для поддержки нового столбца Int64 из google-cloud-bigquery со значением https://github.com/googleapis/google-cloud-python/issues/7702.

Тем временем я предлагаю использовать объект dtype.В версии 1.13.0 google-cloud-bigquery вы можете указать желаемую схему BigQuery, и библиотека будет использовать нужные типы в файле паркета.

    # Schema with all scalar types.
    table_schema = (
        bigquery.SchemaField("int_col", "INTEGER"),
    )

    num_rows = 100
    nulls = [None] * num_rows
    dataframe = pandas.DataFrame(
        {
            "int_col": nulls,
        }
    )

    table_id = "{}.{}.load_table_from_dataframe_w_nulls".format(
        Config.CLIENT.project, dataset_id
    )

    job_config = bigquery.LoadJobConfig(schema=table_schema)
    load_job = Config.CLIENT.load_table_from_dataframe(
        dataframe, table_id, job_config=job_config
    )
    load_job.result()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...