我有一个带有LTV列的bigquery表。列的类型为STRING。
我尝试使用CAST(LTV AS FLOAT64)
将此列强制转换为FLOAT64,但是出现“错误的双精度值: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名称='results.csv'模式='r'编码='UTF-8'>”
这可能是什么原因?
答案 0 :(得分:1)
这可能是什么原因?
可能发生的是,您已将标题行(很可能是原始CSV文件中的标题)加载到BigQuery表中,因此您的代码无法处理该确切行
您可以运行以下示例来重现该确切问题
#standardSQL
WITH t AS (SELECT 'LTV' AS LTV)
SELECT CAST(LTVAS FLOAT64)
FROM t
有结果
错误:错误的双精度值:LTV