我无法使用 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

BigQuery:将整数列转换为日期间隔并添加到日期列

无法在 Google BigQuery 中将此旧版 SQL 转换为标准 SQL

将 MySQL 查询转换为 BigQuery 查询

Bigquery 将字符串转换为日期时间

我使用啥 BigQuery 数据类型来支持许多十进制数字