使用 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