从符合条件的请求中获取所有行

Get all the lines from a request that match a criteria

我试图优化用于搜索我的 AppEngine 应用程序日志的 BigQuery 查询 (exported to BigQuery automatically through Google Cloud Logging),但我收到了一个我不理解的错误。

SELECT
  protoPayload.requestId,
  protoPayload.line.logMessage
FROM (
  SELECT
    protoPayload.requestId AS matchingRequestId
  FROM
   TABLE_DATE_RANGE(MyProject_Logs.appengine_googleapis_com_request_log_, DATE_ADD(CURRENT_TIMESTAMP(), -1, 'HOUR'), CURRENT_TIMESTAMP())
  WHERE
    protoPayload.resource CONTAINS '/url'
    AND protoPayload.line.logMessage CONTAINS 'criteria'
  LIMIT 50)
WHERE
  protoPayload.requestId = matchingRequestId

结果

Query Failed
Error: Field 'protoPayload.requestId' not found.
Job ID: myProject:job_DZpCc0u52LBFh8DFL0nDCsizo8o

这个错误对我来说没有意义,因为当我尝试只执行也使用 protoPayload.requestId 字段的子查询时,它工作正常。

作为旁注,但我仍然很好奇是什么导致了我的查询错误。

  1. 对于问题中的特定示例,此错误对我来说很有意义:

在 subselect 之外 - protoPayload.requestId 不再可见 - 它是 matchingRequestId 基于 protoPayload.requestId AS matchingRequestId

中的别名
  1. 请注意,在您修复对 protoPayload.requestId 的外部(两个)引用后,下一个错误将是关于 protoPayload.line.logMessage
    它对外部 select 也是不可见的,因为 a) 它不是 subselect 的一部分和 b) 从 subselect

    [= 引用 table 28=]
  2. 看起来你过于简化了你的例子,甚至 if/after 上面的固定 - 它对我来说仍然没有多大意义 - 特别是因为 WHERE matchingRequestId = matchingRequestId