是否可以在不使用 BigQuery 清理的情况下查询存储在 Cloud Storage 中的日志数据?
Is it possible to query log data stored Cloud Storage without Cleaning it using BigQuery?
我有大量日志数据从 StackDriver 导出到 Google Cloud Storage。我正在尝试 运行 使用 BigQuery 进行查询。
但是,在 BigQuery 数据集中创建 table 时,我得到
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 接收器导出大量日志数据,其中包含大量唯一的列名称。根据 BigQuery tables.
,其中一些名称无效
解决这个问题的方法是什么?有没有办法不用清理就可以查询日志数据?使用 temporary tables 或其他方式?
注意:我不想将我的数据加载(放入)到 BigQuery 存储中,只是为了查询存在于 Google 云存储中的数据。
* 编辑 *
请参阅此documentation以清楚理解
很遗憾没有!
作为日志分析的一部分,通常会在文件提交到 BigQuery 等持久性接收器之前重塑日志数据和 运行 少数 ETL。
如果日志分析只需要性能监控,并且没有理由为 ETL 创建额外的代码,则所有指标都可以从 REST API stackdriver 监控端点派生。
如果您不需要包含 -
的字段,您可以设置忽略 ignore_unknown_values
。您必须提供所需的架构并使用 ignore_unknown_values
任何与架构不匹配的字段都将被忽略。
我想你可以根据你的申请走这两条路线中的任何一条:
一个。 忽略Header
如果有问题的字段在日志的 header 行中,您可以通过在导入命令中添加 --skip_leading_rows=1
参数来选择忽略 header 行。类似于:
bq location=US load --source_format=YOURFORMAT --skip_leading_rows=1 mydataset.rawlogstable gs://mybucket/path/* 'colA:STRING,colB:STRING,..'
乙。 加载原始数据
如果以上不适用,则只需将 un-structured 原始格式的数据加载到 BigQuery 中即可。一旦你的数据在那里,你就可以去做各种各样的事情了。
因此,首先创建一个具有单列的 table:
bq mk --table mydataset.rawlogstable 'data:STRING'
现在在 table 中加载您的数据集,提供适当的位置:
bq --location=US load --replace --source_format=YOURFORMAT mydataset.rawlogstable gs://mybucket/path/* 'data:STRING'
加载数据后,现在您可以使用 SQL 查询处理它,并根据您的分隔符拆分它并跳过您不喜欢的内容。
摄氏度。 创建外部 Table
如果您不想将数据加载到 BigQuery 中,但又想查询它,您可以选择在 BigQuery 中创建一个外部 table:
bq --location=US mk --external_table_definition=data:STRING@CSV=gs://mybucket/path/* mydataset.rawlogstable
查询数据
如果您选择选项 A 并且它适合您,您可以简单地选择按照您已经执行的方式查询数据。
在您选择 B 或 C 的情况下,您的 table 现在将数据集中的行作为单列行。您现在可以根据您的分隔符要求,选择将这些单列行拆分为多列行。
假设您的行应包含 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`)
希望对您有所帮助。
扩展@khan 的回答:
如果文件是JSON,那么您将无法使用第一种方法(跳过headers)。
但是您可以将每个 JSON 行原始加载到 BigQuery - 就好像它是 CSV - 然后在 BigQuery
中解析
在以下位置查找加载原始行的完整示例:
然后您可以使用 JSON_EXTRACT_SCALAR
在 BigQuery 中解析 JSON - 并将现有的字段名称转换为 BigQuery 兼容的名称。
我有大量日志数据从 StackDriver 导出到 Google Cloud Storage。我正在尝试 运行 使用 BigQuery 进行查询。
但是,在 BigQuery 数据集中创建 table 时,我得到
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 接收器导出大量日志数据,其中包含大量唯一的列名称。根据 BigQuery tables.
,其中一些名称无效解决这个问题的方法是什么?有没有办法不用清理就可以查询日志数据?使用 temporary tables 或其他方式?
注意:我不想将我的数据加载(放入)到 BigQuery 存储中,只是为了查询存在于 Google 云存储中的数据。
* 编辑 *
请参阅此documentation以清楚理解
很遗憾没有!
作为日志分析的一部分,通常会在文件提交到 BigQuery 等持久性接收器之前重塑日志数据和 运行 少数 ETL。
如果日志分析只需要性能监控,并且没有理由为 ETL 创建额外的代码,则所有指标都可以从 REST API stackdriver 监控端点派生。
如果您不需要包含 -
的字段,您可以设置忽略 ignore_unknown_values
。您必须提供所需的架构并使用 ignore_unknown_values
任何与架构不匹配的字段都将被忽略。
我想你可以根据你的申请走这两条路线中的任何一条:
一个。 忽略Header
如果有问题的字段在日志的 header 行中,您可以通过在导入命令中添加 --skip_leading_rows=1
参数来选择忽略 header 行。类似于:
bq location=US load --source_format=YOURFORMAT --skip_leading_rows=1 mydataset.rawlogstable gs://mybucket/path/* 'colA:STRING,colB:STRING,..'
乙。 加载原始数据
如果以上不适用,则只需将 un-structured 原始格式的数据加载到 BigQuery 中即可。一旦你的数据在那里,你就可以去做各种各样的事情了。
因此,首先创建一个具有单列的 table:
bq mk --table mydataset.rawlogstable 'data:STRING'
现在在 table 中加载您的数据集,提供适当的位置:
bq --location=US load --replace --source_format=YOURFORMAT mydataset.rawlogstable gs://mybucket/path/* 'data:STRING'
加载数据后,现在您可以使用 SQL 查询处理它,并根据您的分隔符拆分它并跳过您不喜欢的内容。
摄氏度。 创建外部 Table
如果您不想将数据加载到 BigQuery 中,但又想查询它,您可以选择在 BigQuery 中创建一个外部 table:
bq --location=US mk --external_table_definition=data:STRING@CSV=gs://mybucket/path/* mydataset.rawlogstable
查询数据
如果您选择选项 A 并且它适合您,您可以简单地选择按照您已经执行的方式查询数据。
在您选择 B 或 C 的情况下,您的 table 现在将数据集中的行作为单列行。您现在可以根据您的分隔符要求,选择将这些单列行拆分为多列行。
假设您的行应包含 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`)
希望对您有所帮助。
扩展@khan 的回答:
如果文件是JSON,那么您将无法使用第一种方法(跳过headers)。
但是您可以将每个 JSON 行原始加载到 BigQuery - 就好像它是 CSV - 然后在 BigQuery
中解析
在以下位置查找加载原始行的完整示例:
然后您可以使用 JSON_EXTRACT_SCALAR
在 BigQuery 中解析 JSON - 并将现有的字段名称转换为 BigQuery 兼容的名称。