Google BigQuery 架构与使用 load_table_from_dataframe 的数字数据类型发生冲突(pyarrow 错误)

Dav*_*tia 4 python pandas google-bigquery pyarrow

当我将数字数据(int64 或 float64)从 Pandas 数据框上传到“数字” Google BigQuery 数据类型时,出现以下错误:

pyarrow.lib.ArrowInvalid:获得长度为 8 的字节串(预期为 16)

我尝试更改 Pandas 数据框中“tt”字段的数据类型,但没有结果:

df_data_f['tt'] = df_data_f['tt'].astype('float64')
Run Code Online (Sandbox Code Playgroud)

df_data_f['tt'] = df_data_f['tt'].astype('int64')
Run Code Online (Sandbox Code Playgroud)

使用架构:

 job_config.schema = [
                    ...             
                    bigquery.SchemaField('tt', 'NUMERIC')
                    ...]
Run Code Online (Sandbox Code Playgroud)

阅读此google-cloud-python 问题报告我得到:

数字 = pyarrow.decimal128(38, 9)

因此,“数字” Google BigQuery 数据类型使用比“float64”或“int64”更多的字节,这就是 pyarrow 无法匹配数据类型的原因。


我有:

Python 3.6.4

熊猫1.0.3

pyarrow 0.17.0

谷歌云bigquery 1.24.0

Dav*_*tia 9

我不确定这是否是最好的解决方案,但我通过更改数据类型解决了这个问题:

import decimal
...
df_data_f['tt'] = df_data_f['tt'].astype(str).map(decimal.Decimal)
Run Code Online (Sandbox Code Playgroud)

  • 我想这取决于你的用例。您有使用 NUMERIC 类型的具体原因吗?如果不是,并且您的数据已经是 8 个字节,则更简单的解决方案是直接将 BigQuery 中的数据类型设置为 FLOAT64(如果是整数,则为 INT64)。 (2认同)