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转换失败')
目前存在一个支持来自 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)
| 归档时间: |
|
| 查看次数: |
837 次 |
| 最近记录: |