首页 > 解决方案 > 是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?

问题描述

我有大量从 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 表,其中一些名称无效。

解决方案是什么?有没有办法在不清理的情况下查询日志数据?使用临时表或其他东西?

注意:我不想将我的数据加载(放入)到 BigQuery Storage,只是为了查询 Google Cloud Storage 中存在的数据。

* 编辑 *

请参阅本文档以获得清晰的理解

标签: google-cloud-platformgoogle-bigquerystackdriver

解决方案


我认为您可以根据您的应用程序走以下两条路线中的任何一条:

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`)

希望能帮助到你。


推荐阅读