【问题标题】:Google BigQuery Schema conflict (pyarrow error) with Numeric data type using load_table_from_dataframeGoogle BigQuery Schema 冲突(pyarrow 错误)与使用 load_table_from_dataframe 的数字数据类型
【发布时间】:2020-08-08 19:31:28
【问题描述】:

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

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

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

df_data_f['tt'] = df_data_f['tt'].astype('float64')

df_data_f['tt'] = df_data_f['tt'].astype('int64')

使用架构:

 job_config.schema = [
                    ...             
                    bigquery.SchemaField('tt', 'NUMERIC')
                    ...]

读到google-cloud-python issues report我得到了:

NUMERIC = pyarrow.decimal128(38, 9)

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


我有:

Python 3.6.4

熊猫 1.0.3

pyarrow 0.17.0

google-cloud-bigquery 1.24.0

【问题讨论】:

    标签: python pandas google-bigquery pyarrow


    【解决方案1】:

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

    import decimal
    ...
    df_data_f['tt'] = df_data_f['tt'].astype(str).map(decimal.Decimal)
    

    【讨论】:

    • 我想这取决于您的用例。您有使用 NUMERIC 类型的特定原因吗?如果不是,并且您的数据已经是 8 个字节,更直接的解决方案是直接将 BigQuery 中的数据类型设置为 FLOAT64(如果是整数,则为 INT64)。
    • 嗨,阿尔贝萨!你是对的,这会更容易,但表模式是几个月前定义的,目前有很多数据。因此,问题是在不更改目标表架构的情况下追加新数据。
    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2013-03-25
    相关资源
    最近更新 更多