BigQuery 帮助 - 如何转换并转换为浮点和日期格式

Posted

技术标签:

【中文标题】BigQuery 帮助 - 如何转换并转换为浮点和日期格式【英文标题】:BigQuery Help - How to cast and convert to float and date format 【发布时间】:2019-01-18 21:37:30 【问题描述】:

我正在尝试在 BigQuery 中做两件事,但我在这样做时遇到了困难。

我想做两件事:

    将我的日期列转换为日期格式(目前为int64,以43379为例) 将我的列Delivered_CostActual_Cost 转换为float(它们当前为字符串类型) - 当有空值时,有- 而不是0。当您投射到 float 时,这些 -s 会自动更改为 0 还是我必须先更新它?

我没有太多经验,而且我在网上寻找解决方案时遇到了困难,所以我很想得到任何帮助!我在同时投射和显示表格中的数据时遇到了困难。

谢谢!

SELECT * FROM TABLE1
CAST(Delivered_Cost as float) 

【问题讨论】:

我猜你使用的是标准而不是旧版查询,对吧? 【参考方案1】:
    将我的日期列转换为Date格式(目前是int64,以43379为例)

使用function PARSE_DATE()

PARSE_DATE(Delivered_Date, '%Y-%m-%d')

following doc 列出了支持的格式。

    将我的列“Delivered_Cost”和“Actual_Cost”转换为浮动(当前为字符串类型)

CASE() 的语法没问题;你也可以使用快捷方式FLOAT()。但是,如果您的字符串没有成功映射到浮点数(例如 - 单独),则会发生运行时错误。您可以使用SAFE_CAST() 忽略转换错误,但这也可能导致忽略相关错误。因此,您最好使用REPLACE()

这是您的查询:

SELECT
    PARSE_DATE(Delivered_Date, '%Y-%m-%d') AS Delivered_Date,
    FLOAT(REPLACE(Delivered_Cost, '-', '0')) AS Delivered_Cost,
    FLOAT(REPLACE(Actual_Cost, '-', '0')) AS Actual_Cost  
FROM MYTABLE


FLOAT(Delivered_Cost)

【讨论】:

谢谢!当我使用下面的代码时,它有点工作: SELECT --PARSE_DATE(START_DATE, '%y-%m-%d') AS START_DATE, float(replace(delivered_cost, '-', '0')) AS Delivered_cost FROM table 但是,'-' 值被更改为 null 而不是 0。此外,当我尝试在同一个查询中执行多个 REPLACE 函数时,我得到一个错误。请参阅下面的代码示例: SELECT --PARSE_DATE(START_DATE, '%y-%m-%d') AS START_DATE, float(replace(delivered_cost, '-', '0')) AS Delivered_cost float(replace (total_planned_units, '-', '0')) AS total_planned_units FROM table 道歉 - 我也是 *** 的新手,所以我不熟悉如何以友好的方式粘贴代码。 所以如果它不适合你,我想你不应该接受答案,以免让其他用户得出错误的结论。终于成功了吗?【参考方案2】:

以下是 BigQuery 标准 SQL

#standardSQL
SELECT 
  DATE_FROM_UNIX_DATE(date_column_as_number_of_days_since_epoch) date_since_epoch,
  IFNULL(SAFE_CAST(Delivered_Cost AS FLOAT64), 0.0) AS Delivered_Cost,
  IFNULL(SAFE_CAST(Actual_Cost AS FLOAT64), 0.0) AS Actual_Cost
FROM `project.dataset.table`   

您可以使用下面的虚拟数据进行测试,玩弄它

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 
    43397 AS date_column_as_number_of_days_since_epoch,  
    '123' AS Delivered_Cost,
    ' - ' AS Actual_Cost 
)
SELECT 
  DATE_FROM_UNIX_DATE(date_column_as_number_of_days_since_epoch) date_since_epoch,
  IFNULL(SAFE_CAST(Delivered_Cost AS FLOAT64), 0.0) AS Delivered_Cost,
  IFNULL(SAFE_CAST(Actual_Cost AS FLOAT64), 0.0) AS Actual_Cost
FROM `project.dataset.table`   

结果为

Row date_since_epoch    Delivered_Cost  Actual_Cost  
1   2088-10-25          123.0           0.0     

注意:我假设您在问题中用作示例的 43379 实际上是自纪元以来的天数 - 因为从我的假设来看这是最合理的 - 让我们知道这是否是其他原因,所以我会分别调整答案

【讨论】:

以上是关于BigQuery 帮助 - 如何转换并转换为浮点和日期格式的主要内容,如果未能解决你的问题,请参考以下文章

转换为 IEEE 754 单精度浮点格式帮助

如何将带有 POLYGON 的字符串类型转换为地理类型 - BigQuery

如何将日期转换为 CDT 并使用 BigQuery 制作连接字符串?

将字符串浮点数列表转换为具有 2 个小数点的浮点数列表

如何在Java中将浮点数组转换为双精度数组?

python pandas中如何将dataframe中的一列字符串类型转换为浮点类型?