【问题标题】:Unrecognized column from wildcard table通配符表中无法识别的列
【发布时间】:2017-06-01 21:57:33
【问题描述】:

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

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 重写它,看看是否可行,但我的查询需要选择表元数据。

这是否与通配符不兼容?

【问题讨论】:

  • 还要注意删除APPROX_QUANTILES行会产生有效结果,所以这个错误肯定和bytesJS有关。

标签: google-bigquery


【解决方案1】:

这是一个有效的版本:

#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 表。

【讨论】:

  • 啊,我明白了。因此,这是将运行数据集拆分为页面和请求数据集的一个很好的理由。一定是请求表导致了问题。
  • 是的......另一个“方便”的解决方案是将类型作为前缀
  • Felipe,您知道是否有办法使用 COALESCE 或 IFNULL 来解决“无法识别的名称”问题?
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多