首页 > 解决方案 > 执行 SUM 聚合操作时使用通配符的 Big Query 出错

问题描述

我正在尝试使用谷歌大查询对某些数据进行SUM 聚合。我正在尝试使用通配符来查询多个表。通配符格式适用于某些数据类型的列,例如INTEGER 不适用于其他数据类型,例如FLOAT。以下是我尝试执行的查询的表示

[更新]到目前为止, trip_distance (FLOAT)列似乎失败了。同样的查询适用于另一列passenger_count(INTEGER)

FAILURE CASE : FLOAT (trip_distance) 的通配符格式

单表查询:

select sum(trip_distance)
from  `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*`
where _TABLE_SUFFIX  in ('2014')

查询多个表:

select sum(trip_distance)
from  `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*`
where _TABLE_SUFFIX  in ('2014', '2015')

上述查询引发如下错误

错误:无法将 FLOAT64 类型的字段“trip_distance”读取为 NUMERIC

在此处输入图像描述

我不确定为什么 ABOVE 错误,因为以下查询有效(我想避免使用非通配符,因为它会变得很大,因为人们想要查询更多表)。

SUCCEEDS:passenger_count 的通配符格式(整数)

单表查询:

select sum(passenger_count)
from  `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*`
where _TABLE_SUFFIX  in ('2014')

查询多个表:

select sum(passenger_count)
from  `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*`
where _TABLE_SUFFIX  in ('2014', '2015')

成功:没有通配符的正常语法

单表查询

select sum(trip_distance)
from  `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_2014`

查询多个表:

select sum(trip_distance)
from 
(
  select trip_distance
  from  `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_2014`
  UNION ALL
  select trip_distance
  from  `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_2015`
)

有人可以告诉我在使用通配符时缺少什么。我更喜欢使用标准 sql 格式的答案。

标签: sqlgoogle-bigquery

解决方案


当我尝试运行这个简单的查询时:

select trip_distance
from `bigquery-public-data.new_york_taxi_trips.tlc_green_trips_*`
where _TABLE_SUFFIX  in ('2014')
limit 100

我收到错误消息:

查询失败

错误:无法将 FLOAT64 类型的字段“trip_distance”读取为 NUMERIC

我以前没有见过这个错误。数据在预览窗格中看起来不错。我只能假设基础数据中有些东西搞砸了。在 2014 年(假设数据是在那个时间范围内加载的),数据类型不可能是NUMERIC- 所以我不知道从哪里来NUMERIC

不用说——鉴于该列根本无法读取——该列无法转换为我尝试过的任何其他类型。

我认为数据已损坏。我不确定在 Google 应该联系谁,但应该修复或删除它。

编辑:

我得到了它。数据NUMERIC位于表格的最新版本(2018 年)中。问题在于*语法。这是使用表的最新定义,并且存在类型不兼容(它可以进行转换,但不能)。

我想你已经弄清楚了如何独立查询每个表,所以你可以解决这个问题。

如果这是一个问题,因为您需要混合来自不同年份的数据,那么您可以创建一个视图来执行您需要的转换(尽管使用该视图可能会增加查询成本)。


推荐阅读