【问题标题】:How to use the new Int64 pandas object when saving to a parquet file保存到镶木地板文件时如何使用新的 Int64 熊猫对象
【发布时间】:2019-10-19 03:02:49
【问题描述】:

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

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

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

导入包含缺失值的 int 列的 CSV:

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

id 8 非空 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: ('Did not pass numpy.dtype object', 'Conversion failed for column id with type Int64')

【问题讨论】:

  • 专门针对 BigQuery,您在下面得到了答案。但一般来说,要写入 Parquet,pyarrow 首先需要添加对可为空的 Int64 类型的支持,这是一个悬而未决的问题:issues.apache.org/jira/browse/ARROW-5379

标签: python google-bigquery parquet pyarrow


【解决方案1】:

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

同时,我建议使用 object dtype。在 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()

【讨论】:

猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 2022-11-03
  • 2018-12-01
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多