保存到实木复合地板文件中时如何使用新的Int64 pandas对象

dha*_*nar 5 python google-bigquery parquet pyarrow

我正在使用Python(Pandas)将数据从CSV转换为Parquet,以便稍后将其加载到Google BigQuery中。我有一些整数列,其中包含缺少的值,并且自Pandas 0.24.0起,我可以将它们存储为Int64 dtype。

有没有办法在镶木地板文件中使用Int64 dtype?对于找不到值的整数,我找不到干净的解决方案(因此它们在BigQuery中仍然是INTEGER)。

我尝试将其直接导入到BigQuery中,并得到了与使用Pandas转换为镶木地板时相同的错误(如下所示)。

导入带有int列的CSV,其中包含缺少的值:

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

ID 8非空float64

该行被导入为float64。我将类型更改为Int64:

df["id"] = df["id"].astype('Int64')
print(df["id"].info())
Run Code Online (Sandbox Code Playgroud)

ID 8非空Int64

然后,我尝试保存到实木复合地板上:

df.to_parquet("output/test.parquet")
Run Code Online (Sandbox Code Playgroud)

错误:

pyarrow.lib.ArrowTypeError:('未传递numpy.dtype对象','类型为Int64的列ID转换失败')

Tim*_*ast 3

目前存在一个支持来自 google-cloud-bigquery 的新 Int64 列的未解决问题,网址为https://github.com/googleapis/google-cloud-python/issues/7702

同时,我建议使用对象数据类型。在 google-cloud-bigquery 版本 1.13.0 中,您可以指定所需的 BigQuery 架构,并且该库将在 parquet 文件中使用所需的类型。

    # 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()
Run Code Online (Sandbox Code Playgroud)