(我对数据库很陌生,所以请让我知道如何使这个问题更好。)
我正在尝试从AWS S3存储桶中将多个列数据文件加载到BigQuery中
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看起来相对简单。
但是,我的问题是,是否可以将这些数据分别加载到我的主要网站的单独表中(每个主要网站一个表),并分别将其加载到其他表中?
答案 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/*
这应该有效。