来自通配符表的无法识别的列

时间:2017-06-01 21:57:33

标签: google-bigquery

我需要在匹配某些命名方案的所有表中查询相同的聚合统计信息:

SELECT
  SUBSTR(CONCAT('20', _TABLE_SUFFIX), 0, 10) AS date,
  CASE
    WHEN ENDS_WITH(_TABLE_SUFFIX, 'mobile') THEN 'mobile'
    ELSE 'desktop'
  END AS client,
  APPROX_QUANTILES(bytesJS,1000)[OFFSET(500)] AS p50
FROM
  `httparchive.runs.20*`
WHERE
  ENDS_WITH(_TABLE_SUFFIX, '_pages')
  OR ENDS_WITH(_TABLE_SUFFIX, '_pages_mobile')
GROUP BY
  1,
  2
ORDER BY
  1,
  2

但是,查询失败了Error: Unrecognized name: bytesJS at [7:20]

应该有大约150个与查询匹配的表。以下是其中一个表的架构:https://bigquery.cloud.google.com/table/httparchive:runs.2017_05_15_pages

bytesJS是一个有效的列名,但由于无法识别而失败。替换不同的已知列时出现相同的错误。我不确定这是否是使用表格通配符的直接结果。

我会用遗留SQL重写它,看看是否有效,但我的查询需要选择表元数据。

这是否与通配符不兼容?

1 个答案:

答案 0 :(得分:2)

这是一个有效的版本:

#standardSQL
SELECT
  SUBSTR(CONCAT('20', _TABLE_SUFFIX), 0, 10) AS date,
  CASE
    WHEN ENDS_WITH(_TABLE_SUFFIX, 'mobile') THEN 'mobile'
    ELSE 'desktop'
  END AS client,
  APPROX_QUANTILES(bytesJS,1000)[OFFSET(500)] AS p50
FROM
  `httparchive.runs.2017_05_15_pages*`
#WHERE
  #ENDS_WITH(_TABLE_SUFFIX, '_pages')
  #OR ENDS_WITH(_TABLE_SUFFIX, '_pages_mobile')
GROUP BY
  1,
  2
ORDER BY
  1,
  2

发生了什么:

  • httparchive.runs.20*包含一些不具有bytesJS列的表格,因此不会考虑该列的剩余部分。
  • 当查询查找(_TABLE_SUFFIX, '_pages') OR (_TABLE_SUFFIX, '_pages_mobile')时,更改查询假设架构为时已晚。

解决方案:

  • FROM prefix* table glob在这里工作,你必须运行一个经典的UNION表。