将数据加载到BigQuery中并根据时间对数据进行分区,并按其他变量进行拆分

时间:2018-10-14 06:27:58

标签: google-bigquery

(我对数据库很陌生,所以请让我知道如何使这个问题更好。)

我正在尝试从AWS S3存储桶中将多个列数据文件加载到BigQuery中

  • 它是150多个不同网站的网络分析数据
  • 有多个文件,每个文件包含15分钟的网络分析数据
  • 每个文件包含15分钟内所有150个网站的数据,但是有一个名为site_code的列,它告诉我们该行与哪个网站有关

以下是相关列的快照:

timestamp_info_nginx_ms site_code action
          1.539168e+12    site_1  event1
          1.539168e+12    site_2  event2
          1.539168e+12    site_3  event1
          1.539168e+12    site_1  event1
          1.539168e+12    site_2  event2

每周的数据量为200 + GB,我希望能够加载12周的数据。

我的目标是最大限度地减少每月查询费用。

某些情况:我的主要用例是,我将一次分析一个网站(或一组网站)的数据。在这150个网站中,我将主要关注10-15个网站。我们称它们为主要网站。我希望定期(每天)分析主要网站,而其他网站则偶尔(每月1-3次)或很少(在2个月内1-3次)进行分析。

我了解我需要按天对数据表进行分区。通过BigQuery GUI看起来相对简单。

但是,我的问题是,是否可以将这些数据分别加载到我的主要网站的单独表中(每个主要网站一个表),并分别将其加载到其他表中?

1 个答案:

答案 0 :(得分:0)

看过BigQuery最近发布的称为集群的功能,这正是我所需要的。以下几行代码将解决有关样本数据集的问题。

对于此用例,我假设数据存储在GCS中,并且它是ndjson和压缩文件。

发布此答案时,无法通过Web UI创建聚簇表,因此我正在通过安装gcloud sdk查看命令行选项。

虽然可以在加载数据时创建分区表(如在创建表和将数据加载到表中的操作可以同时完成),但是(到目前为止)不可能同时创建一个分区表。集群表。因此,这是一个两步过程,其中第一步是创建一个空表。步骤2是将数据加载到其中。

鉴于我的样本数据集,我的架构将如下所示:

 [
   {"type": "TIMESTAMP", "name": "timestamp_info_nginx_ms", "mode": "NULLABLE"},
   {"type": "STRING", "name": "site_code", "mode": "NULLABLE"},
   {"type": "STRING", "name": "action", "mode": "NULLABLE"}
  ]

将上述json作为myschema.json存储在当前工作目录中
请注意,我的分区文件将是时间戳记,而我的群集字段将是site_code和action。完成聚类的顺序很重要。在此

上运行查询时,请记住集群顺序

在BigQuery中创建一个名为my-dataset的数据集。

现在在终端中调用gcloud sdk的bq命令来创建表。

bq mk -t --schema ./myschema.json --time_partitioning_type=DAY --time_partitioning_field timestamp_info_nginx_ms --require_partition_filter=TRUE --clustering_fields='site_code,action' my-dataset.my-clustered-table

这应该在名为my-dataset的现有数据集中创建一个名为my-clustered-table的新表。

现在使用终端中的gcloud sdk的bq命令将数据加载到表中。

bq load --source_format=NEWLINE_DELIMITED_JSON --max_bad_records=1000 my-dataset.my-clustered-table gs://my-bucket/my-json-files/*

这应该有效。