是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?
Posted
技术标签:
【中文标题】是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?【英文标题】:Is it possible to query log data stored Cloud Storage without Cleaning it using BigQuery? 【发布时间】:2019-09-04 13:07:41 【问题描述】:我有大量从 StackDriver 导出到 Google Cloud Storage 的日志数据。我正在尝试使用 BigQuery 运行查询。
但是,在 BigQuery 数据集中创建表时,我得到了
Invalid field name "k8s-app".
Fields must contain only letters, numbers, and underscores, start with a letter or underscore, and be at most 128 characters long.
Table: bq_table
大量日志数据从 StackDriver sinks 导出,其中包含大量唯一列名。根据 BigQuery 表,其中一些名称无效。
解决办法是什么?有没有办法在不清理的情况下查询日志数据?使用temporary tables 或其他什么?
注意:我不想将我的数据加载(放入)到 BigQuery Storage,只是为了查询 Google Cloud Storage 中存在的数据。
* 编辑 *
请参考这个documentation了解清楚
【问题讨论】:
我假设 Stackdriver Logging 中的搜索工具 |日志查看器不做您需要做的事情,这就是您导出数据并寻找不同方式来查询数据的原因?只是想在我尝试提供答案之前确定一下。谢谢。 是的,它们不允许修改日志类型或任何日志数据。日志只能删除 【参考方案1】:我认为您可以根据您的应用程序选择以下两条路线中的任何:
A. 忽略标题
如果有问题的字段位于日志的标题行中,您可以通过在导入命令中添加 --skip_leading_rows=1
参数来选择忽略标题行。比如:
bq location=US load --source_format=YOURFORMAT --skip_leading_rows=1 mydataset.rawlogstable gs://mybucket/path/* 'colA:STRING,colB:STRING,..'
B. 加载原始数据
如果上述内容不适用,则只需将非结构化原始格式的数据加载到 BigQuery 中即可。一旦你的数据在那里,你就可以开始做各种各样的事情了。
所以,首先创建一个单列的表:
bq mk --table mydataset.rawlogstable 'data:STRING'
现在将您的数据集加载到提供适当位置的表中:
bq --location=US load --replace --source_format=YOURFORMAT mydataset.rawlogstable gs://mybucket/path/* 'data:STRING'
加载数据后,现在您可以使用 SQL 查询对其进行处理,并根据您的分隔符将其拆分并跳过您不喜欢的内容。
C. 创建外部表
如果您不想将数据加载到 BigQuery 但仍想查询,可以选择在 BigQuery 中创建外部表:
bq --location=US mk --external_table_definition=data:STRING@CSV=gs://mybucket/path/* mydataset.rawlogstable
查询数据
如果您选择选项 A 并且它适合您,您可以简单地选择以您已经在做的方式查询您的数据。
如果您选择 B 或 C,您的表现在将数据集中的行作为单列行。您现在可以选择根据您的分隔符要求将这些单列行拆分为多个列行。
假设您的行应该有 3 列,分别命名为 a、b 和 c:
a1,b1,c1
a2,b2,c2
现在它全部采用名为data
的单列形式,您可以用分隔符,
分隔:
select
splitted[safe_offset(0)] as a,
splitted[safe_offset(1)] as b,
splitted[safe_offset(2)] as c
from (select split(data, ',') as splitted from `mydataset.rawlogstable`)
希望对你有帮助。
【讨论】:
我不想将数据加载到 BigQuery 表中。只是在寻找一种查询 Google Cloud Storage 存储桶中存在的日志数据的方法。我认为documentation 中解释了类似的内容 好的。然后,在这种情况下,您可能需要考虑使用 BigQuery 创建外部表(这样您就可以在不加载到 BigQuery 的情况下查询数据)。 您能否更具体一些并使用相关命令/信息编辑您的答案,以便可以按照它完成任务并作为答案接受? 如果有帮助,请告诉我。 :-)【参考方案2】:扩展@khan 的回答:
如果文件是 JSON,那么您将无法使用第一种方法(跳过标头)。
但是您可以将每个 JSON 行原始加载到 BigQuery - 就像它是 CSV 一样 - 然后在 BigQuery 中解析
在以下位置找到加载原始行的完整示例:
https://medium.com/google-cloud/bigquery-lazy-data-loading-ddl-dml-partitions-and-half-a-trillion-wikipedia-pageviews-cd3eacd657b6然后您可以使用JSON_EXTRACT_SCALAR
在 BigQuery 中解析 JSON - 并将现有字段名称转换为 BigQuery 兼容的名称。
【讨论】:
我是否应该使用 Cloud Dataflow 将数据加载到 BigQuery 并在其间添加转换步骤?这是一种好方法还是您在文章中描述的方法? 我更喜欢在 BigQuery 中进行清理。如果架构发生变化,没有丢失数据的风险 在 BigQuery 中清理数据是什么意思?就像你在文章中解释的那样?【参考方案3】:很遗憾没有!
作为日志分析的一部分,在将文件提交到 BigQuery 等持久接收器之前,通常会重塑日志数据并运行少量 ETL。
如果日志分析只需要性能监控,并且没有理由为 ETL 创建额外代码,则所有指标都可以从堆栈驱动程序监控的 REST API 端点派生。
【讨论】:
【参考方案4】:如果您不需要包含-
的字段,您可以设置忽略ignore_unknown_values
。您必须提供您想要的架构并使用ignore_unknown_values
任何与架构不匹配的字段都将被忽略。
【讨论】:
我需要这些字段。由于 Stackdriver 日志中生成的许多字段在 BigQuery 中被视为无效,以上是关于是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?的主要内容,如果未能解决你的问题,请参考以下文章
在不使用表格的情况下从 BigQuery 中的 csv 文件中检索数据
BigQuery - 如何在不使用列名作为值的情况下导入 CSV?