首页 > 解决方案 > Big-Query 中非空值的“错误双值”错误

问题描述

我有一个带有 LTV 列的 bigquery 表。列的类型是 STRING。我尝试使用 将此列转换为 FLOAT64 CAST(LTV AS FLOAT64),但出现“Bad double value: LTV”错误(bigquery 标准)。我查看了导致错误的特定行(对于许多行来说它工作得很好),我看到该值是“51.0”,看起来是合法的。我运行这个查询:

SELECT LTV, LENGTH(LTV) AS len_ltv, SAFE_CAST(LTV AS FLOAT64) AS ltv_safe_cast, CASE WHEN LTV = '51.0' THEN 'eq' ELSE 'neq' END AS eq_str, CAST(SAFE_CAST(LTV AS FLOAT64) AS STRING) AS ltv_double_cast, CAST(SAFE_CAST(LTV AS FLOAT64) AS STRING) = LTV AS ltv_double_cast_eq_str FROM mytable

并得到了那些结果

当我将有问题的行保存为 CSV 文件,然后使用“自动检测方案”选项再次将其上传为表格时,LTV 列被解析为 FLOAT64。但是当我创建方案并指定 LTV 列类型为 STRING 时,上传失败(文件- 我希望文件保持相同的格式)。

运行file results.csv返回“ASCII 文本”

用 Python 打印文件:

with open('results.csv') as f: print(f)

“<_io.TextIOWrapper 名称='results.csv' 模式='r' 编码='UTF-8'>”

这可能是什么原因?

标签: google-bigquery

解决方案


这可能是什么原因?

可能发生的情况是您将标题行(来自最有可能的原始 CSV 文件)加载到 BigQuery 表中,因此您的代码无法处理该确切行

您可以运行下面的示例来重现该确切问题

#standardSQL
WITH t AS (SELECT 'LTV' AS LTV)
SELECT CAST(LTVAS FLOAT64)
FROM t

结果

错误:错误的双值:LTV


推荐阅读