【问题标题】:'Bad double value' error in Big-Query for non-null valueBig-Query 中非空值的“错误双值”错误
【发布时间】:2019-02-03 09:27:27
【问题描述】:

我有一个包含 LTV 列的 bigquery 表。列的类型是 STRING。 我尝试使用CAST(LTV AS FLOAT64) 将此列转换为 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

并得到了那些results

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

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

在 Python 中打印文件:

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

"<_io.textiowrapper name="results.csv" mode="r" encoding="UTF-8">"

这可能是什么原因?

【问题讨论】:

  • 看了几遍还是没看懂你的问题。根据错误,听起来您在表中确实有 'LTV' 的值。
  • 'LTV' 只是列的名称。这些值是转换为字符串的浮点数,例如'12.0'、'51.0'等。导致问题的行具有值'51.0'。请查看此查询的结果 (results) 以更好地理解问题。

标签: google-bigquery


【解决方案1】:

这可能是什么原因?

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

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

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

结果

错误:错误的双精度值:LTV

【讨论】:

  • 'LTV' 只是列的名称。这些值是转换为字符串的浮点数,例如'12.0'、'51.0'等。导致问题的行具有值'51.0'。请查看此查询的结果 (results) 以更好地理解问题。
  • 我很确定这也是问题所在;它可能是标题行,而不是 51.0。
  • 你错了。它不是标题行。请查看我发送的结果链接。 SAFE_CAST 在这一行的输出确实给出了 51.0 的值!我很确定SAFE_CAST('LTV') !=51.0
  • 我们不是在这里坚持,而是试图帮助你:o)我能够得出的唯一结论(基于你的问题的信息) - 就是我的答案。这里最重要的证据是“Bad double value: LTV”——它只是明确声明该值是“LTV”而不是“51.0”。不过,其他人可能会提出其他想法:o)
  • 是的,当然,我很感激。我无法为您提供结果的屏幕截图,但我提供了屏幕截图的链接。在链接中,您可能会看到“SAFE_CAST(LTV)”的结果是 51.0 其中 LTV 是列名而不是字符串
猜你喜欢
  • 1970-01-01
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多