代码之家  ›  专栏  ›  技术社区  ›  Rachit Kinger

将数据加载到BigQuery中,并根据时间对数据进行分区,以及按另一个变量进行拆分

  •  0
  • Rachit Kinger  · 技术社区  · 6 年前

    (我对数据库非常陌生,所以请告诉我如何更好地回答这个问题。)

    • 它是150多个不同网站的网络分析数据
    • 每个文件包含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
    

    我的目标是尽量减少每月的查询成本。

    一些背景: 我的主要用例是一次分析一个网站(或一组网站)的数据。在这150个网站中,我将主要关注10-15个网站。我们给他们打电话吧 主要网站

    我知道我需要按天划分数据表。通过BigQueryGUI做起来相对简单。

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rachit Kinger    6 年前

    看了BigQuery最近发布的名为集群的功能后,它正是我想要的。下面几行代码将解决我关于示例数据集的问题。

    在发布这个答案时,不可能通过web UI创建集群表,因此我正在通过安装gcloud sdk查看命令行选项。

    虽然可以在加载数据时创建分区表(因为可以同时创建表并将数据加载到分区表中),但不可能同时创建集群表(现在)。因此,这是一个两步的过程,第一步是创建一个空表;第二步是将数据加载到其中。

    给定我的示例数据集,我的模式将如下所示:

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


    注意,我的分区字段将是timestamp,集群字段将是site\u代码和操作。聚类的顺序很重要。当您在这个服务器上运行查询时,请记住集群顺序

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

    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的新表。

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

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

    这应该管用。