我正在使用 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: ('未传递 numpy.dtype 对象', 'Int64 类型的列 id 转换失败')
目前有一个未解决的问题来支持来自 google-cloud-bigquery 的新 Int64 列:https://github.com/googleapis/google-cloud-python/issues/7702 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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)