【发布时间】: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