使用 BigQuery 选择所有相关行(从 GAE 读取日志)

Posted

技术标签:

【中文标题】使用 BigQuery 选择所有相关行(从 GAE 读取日志)【英文标题】:Selecting all related rows with BigQuery (reading logs from GAE) 【发布时间】:2015-09-28 21:42:21 【问题描述】:

我的 Google App Engine 日志正在通过标准 streaming export tool 导出到 BigQuery。我想查询“向我显示所有日志行中任何日志行都包含字符串的请求”。

此查询为我提供了我感兴趣的请求 ID:

SELECT protoPayload.requestId AS reqId
  FROM TABLE_QUERY(logs, 'true') 
  WHERE protoPayload.line.logMessage contains 'INTERNAL_SERVICE_ERROR'

...这让我可以查询相关行:

SELECT
  metadata.timestamp AS Time,
  protoPayload.host AS Host,
  protoPayload.status AS Status,
  protoPayload.resource AS Path,
  protoPayload.line.logMessage
FROM
  TABLE_QUERY(logs, 'true')
WHERE
  protoPayload.requestId in ("requestid1", "requestid2", "etc")
ORDER BY time

但是,我无法将两者合并到一个查询中。 BQ 似乎不允许在 WHERE 子句中进行子选择,当我尝试对命名表进行传统的自联接时,我会收到令人困惑的错误消息。秘诀是什么?

【问题讨论】:

加入应该可以。什么是令人困惑的错误信息?你能分享你的加入 sql 以便我们帮助编辑它吗? 【参考方案1】:

要选择至少一个 logMessage 包含给定字符串的行,可以使用 OMIT IF 构造

SELECT
  metadata.timestamp AS Time,
  protoPayload.host AS Host,
  protoPayload.status AS Status,
  protoPayload.resource AS Path,
  protoPayload.line.logMessage
FROM
  TABLE_QUERY(logs, 'true')
OMIT RECORD IF
  EVERY(NOT (protoPayload.line.logMessage contains 'INTERNAL_SERVICE_ERROR'))
ORDER BY time

【讨论】:

不,它只返回匹配的特定行。 protoPayload.line 是重复记录字段;鉴于请求中的任何一行都符合条件,我想要请求中的所有行。 知道了 - 我相应地更改了建议的答案 哇,这根本不是我所期望的。效果很好 - 谢谢!

以上是关于使用 BigQuery 选择所有相关行(从 GAE 读取日志)的主要内容,如果未能解决你的问题,请参考以下文章

在 GAE 上用 Java 编写 Cron 作业以运行 BigQuery

Python GAE - 如何以编程方式将数据从备份导出到 Big Query?

Google BigQuery python - 错误分页表

从 GoogleAds 导入的 BigQuery 显示所有与 CPM 相关的字段,值为 0

如果一个数组包含使用 BigQuery 的另一个数组的所有值,我如何过滤行?

在 GAE 中使用任务队列插入批量数据