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

时间:2016-01-14 14:58:54

标签: google-app-engine google-bigquery google-cloud-logging

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

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字段的子查询时,它工作正常。

正如旁注,this SO answers better what I am trying to achieve但我仍然很好奇是什么导致了我的查询中的错误。

1 个答案:

答案 0 :(得分:1)

  1. 对于我在问题中的特定示例,此错误对我有意义:
  2. 在子选择之外 - protoPayload.requestId不再可见 - 基于matchingRequestId中的别名protoPayload.requestId AS matchingRequestId

    1. 请注意,在您修改protoPayload.requestId的外部(两个)引用后,下一个错误将是protoPayload.line.logMessage左右 外部选择也不可见,因为a)它不是subselect的一部分,b)从subselect引用表

    2. 看起来你过度简化了你的例子,即使在上面的/固定之后 - 它对我来说仍然没有多大意义 - 特别是因为WHERE matchingRequestId = matchingRequestId