在 BigQuery 中将包含空单元格、NULL 和字符串的列转换为 FLOAT64

CAST a column contain empty cells, NULL and String to FLOAT64 in BigQuery

我遇到了一个无法解决的将字符串转换为浮动的问题。我在 BQ table 中有一列包含值(数字作为字符串)、NULL 和空单元格。现在,我想将这些值转换为 FLOAT64,但出现双值错误。我试过了:

CAST(myfield AS FLOAT64) as myfield

并认为用 NULL 替换空字段可能会有所帮助:

CAST(REGEXP_REPLACE(myfield, " ", NULL) AS FLOAT64 ) as myfield

但这会将所有内容设置为 NULL。

任何关于如何解决这个问题的想法都将不胜感激。

要从字符串中删除字符,请使用空字符串,而不是 NULL:

CAST(REGEXP_REPLACE(myfield, ' ', '') AS FLOAT64 ) as myfield

REGEXP_REPLACE() 对这个操作来说太过分了。您可以只使用常规 REPLACE():

CAST(REPLACE(myfield, ' ', '') AS FLOAT64 ) as myfield

根据您对另一个问题的评论,很明显 space 不是您数据中的唯一问题。

您需要识别并修复问题数据(理想情况下,这应该在摄取到数据库之前完成,但这是一个不同的问题)

例如,您可以使用 safe_cast():

SAFE_CAST() 不会抛出错误,而是 returns NULL,所以你可以检查那些 NULLs...

SELECT
  *
FROM
  yourTable
WHERE
      myfield IS NOT NULL
  AND SAFE_CAST(REPLACE(myfield, ' ', '') AS FLOAT64) IS NULL

或者,只需在查询中使用 SAFE_CAST()(而不是 CAST()) 并接受格式错误的数据会产生 NULL

  • 防止运行时错误
  • 但是 'hides' 错误数据为 NULLs

编辑:

此外,您还可以通过去除其他白色 space 字符来使您的 REPLACE() 更健壮 (例如制表符、回车符 returns 等).