我无法使用 bigquery 将数字转换为 float64,不断出现错误的双值错误
Posted
技术标签:
【中文标题】我无法使用 bigquery 将数字转换为 float64,不断出现错误的双值错误【英文标题】:I'm unable to cast numbers as float64 using bigquery, keep getting bad double value errors 【发布时间】:2021-12-29 01:38:33 【问题描述】:我正在尝试从某些字符之间提取数字作为子字符串,然后再使用 BigQuery 将它们转换为 float64,但是对于某些值,我遇到了错误的双值错误。我尝试使用 safe_cast 来确定哪些值导致错误并且它们返回为 null(如预期的那样),但我似乎无法弄清楚为什么这些值不能转换为 float64,因为它们实际上是数字。与异常的唯一共同点是连续提取的第一个数字是 0,但还有其他值可以做到这一点并且被正确转换。
这是从中提取数字的字符串示例:AOS-1545902(NCP)*0@84#475
,它是存储在名为tr
的表中的object_text
。
所以在这种情况下,提取的第一个数字是 '*' 和 '@' 之间的 0,第二个是 '@' 和 '#' 之间的 84,最后一个是 '#' 之后的 475 .
这是我用来提取数字并将它们转换为 float64 的查询:
cast(substr(tr.object_text, strpos(tr.object_text,'*')+1, (strpos(tr.object_text,'@')-(strpos(tr.object_text,'*')+1))) as float64) AS FP_Share,
safe_cast(substr(tr.object_text, strpos(tr.object_text,'@')+1, (strpos(tr.object_text,'#')-(strpos(tr.object_text,'@')+1))) as float64) AS V_Share,
cast(substr(tr.object_text, strpos(tr.object_text,'#')+1) as float64) as Cust_Price,
从这些中,V_Share('@' 和 '#' 之间的数字)是具有这些异常的那个,当我使用此查询提取数字而不将其转换为 float64 时:
substr(tr.object_text, strpos(tr.object_text,'@')+1, (strpos(tr.object_text,'#')-(strpos(tr.object_text,'@')+1))) AS noCast_V_Share,
您可以在下面的 sn-p 中看到总共 8 个这些异常: Results Snippet
希望有人能帮我解决这个问题!
【问题讨论】:
您的字符串中似乎有一些不可见的字符(可能是不可见的 UTF8 字符);Bad double value: 84\342\200\254
是我在测试您的示例时遇到的错误。
这就是我所倾向于的,但是这些字符串是手动输入到数据库中的,所以我不确定有人如何通过键入来输入不可见的 utf-8 字符。感谢您的回复,我会更深入地研究它。仍然愿意接受更多建议!
【参考方案1】:
由于您似乎有不可打印的字符导致提取问题,您可以使用REGEXP_EXTRACT 仅提取应该导致有效转换的数字(如果需要,可能还有句点),例如;
CAST(
REGEXP_EXTRACT(
SUBSTR(tr.object_text,
STRPOS(tr.object_text,'@')+1,
(STRPOS(tr.object_text,'#')-(STRPOS(tr.object_text,'@')+1))),
'[0-9.]+'
) AS FLOAT64
) AS V_Share
【讨论】:
这正是问题所在,我发现异常包含这些字符“—,这绝对不应该是条目的一部分,仍然不确定它们是如何到达那里的,但 REGEXP_EXTRACT 应该绝对解决这个问题!非常感谢!以上是关于我无法使用 bigquery 将数字转换为 float64,不断出现错误的双值错误的主要内容,如果未能解决你的问题,请参考以下文章
无法将 BigQuery 旧版 SQL 转换为 HAVING LEFT(...) 的标准 SQL