【问题标题】:"bad double value" in Google BigQueryGoogle BigQuery 中的“错误双值”
【发布时间】:2017-05-07 23:14:57
【问题描述】:

我正在使用 Google BigQuery(不使用 LegacySQL),我目前正在尝试将字符串 cast() 为 float64。每次我收到错误“Bad double value”。我也尝试过 safe_cast() 但它完全消除了我的一些 id(例如:如果一个客户在 3 个不同的日期重复 3 次,并且对于单个“Height”条目只有“null”,那么该客户在之后被完全消除我做的是 safe_cast(),而不仅仅是具有“null”值的行)。我的数据中没有任何奇怪的字符串值,只有整数或有理数或空条目。

这是我当前的代码:

select id, date,        
       cast(height as float64) as height,    
       cast(weight as float64) as weight   
from (select id, date, max(height) as height, max(weight) as weight   
      from table    
      group by 1,2
     )
group by 1, 2

【问题讨论】:

  • 身高和体重(字符串)是什么样的?我能想到有问题的字符串;例如NaN 或 BigQuery 可能会拒绝的所谓的“次正常”双精度值(小于 1E-308)。更不用说像“REALLY TALL”这样的高度字符串值了:-)

标签: sql string casting google-bigquery


【解决方案1】:

当然safe_cast() 返回NULL 值。那是因为你在数据中有不合适的值。

您可以通过以下方式找到这些:

select height, weight
from table
where safe_cast(height) is null or safe_cast(weight) is null;

一旦您了解了这些值是什么,请修复这些值或调整查询的逻辑。

如果您只是希望最大值是正确的数字,则在聚合之前强制转换:

select id, date,
       max(safe_cast(height as float64)) as height,
       max(safe_cast(weight as float64)) as weight   
from table    
group by 1, 2;

对于您的查询,子查询似乎没有必要或不可取。

【讨论】:

  • safe_cast() 不返回空值,如果该客户一天有一个空值,它会完全消除我数据中的客户 ID。例如:如果一位客户在 3 个不同的日期重复 3 次,并且只有一个“身高”条目为“空”,则在我执行 safe_cast() 后他们将被淘汰。所有条目要么是整数要么是有理数(即,除了“null”之外别无其他)。
  • @ksitt 。 . .当我在select 中使用safe_cast() 时,它会返回NULL 并且不会过滤值——正如它记录的那样。
猜你喜欢
  • 2016-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多