Google bigquery BigQuery—6年订单迁移、表/查询设计

Google bigquery BigQuery—6年订单迁移、表/查询设计,google-bigquery,Google Bigquery,我正在建立一个Spark项目,将6年的电子商务订单/活动迁移到我们新的BigQuery仓库,以补充新的流媒体功能。迁移的数据与新数据位于同一模型中,视图将根据需要显示零件 我们有4个数据集: 数据(原始数据-分层JSON) 视图(如原始数据上的DIM-通常为平面,但并非始终如此) 预汇总(例如,包括一些关键汇总DIM的货币换算原始总额-平) 报告(如您所想) 与一些新的实时数据不同的是,这些数据流是无限的,这些历史数据的迁移是批量的和有界的(例如,我不必担心延迟到达的事件/水印和重复)。我还可以

我正在建立一个Spark项目,将6年的电子商务订单/活动迁移到我们新的BigQuery仓库,以补充新的流媒体功能。迁移的数据与新数据位于同一模型中,视图将根据需要显示零件

我们有4个数据集:

数据(原始数据-分层JSON) 视图(如原始数据上的DIM-通常为平面,但并非始终如此) 预汇总(例如,包括一些关键汇总DIM的货币换算原始总额-平) 报告(如您所想)

与一些新的实时数据不同的是,这些数据流是无限的,这些历史数据的迁移是批量的和有界的(例如,我不必担心延迟到达的事件/水印和重复)。我还可以通过事件时间(orderPlacedTimestamp)手动对数据进行分区,并保存在正确的日期分区表(后缀?)中。完整的数据在BQ中压缩了大约2 GBs和2百万行,因此不需要大量但相当复杂的结构,并且视图层中不需要进行测试。我可以选择从Spark以materialsied表的形式编写原始数据和聚合数据,因此我真的希望按照最佳实践进行编写并优化性能(查询速度更为重要,值得为此付出一些额外的代价)

我发现这个关于SQL/QueryLambda体系结构的博客非常好,这是一些启发,我将尝试做类似的事情

我仍然想知道如何最好地存储/分区这些数据,然后构造基于时间的查询来匹配。每周、每月的报告可能是最常见的

我的选择似乎是:

  • 所有内容都放在一个表中—看起来很简单,没有持续的表管理,但这意味着每次查询都要进行完整扫描,而我通常只想从某个时间点返回最多一年或两年

  • 每个时间段一张表,例如每年、每月

  • 订单历史记录2017或订单历史记录201701

    我们有一个日历查找dim,每行都有可以使用上面后缀的键-例如2017年1月的201701

    一个月就有72张桌子,看起来有点多,也许一年一次更好

    为了便于讨论,比如说它的月度表,在BQ(标准SQL)中,查询包含连续时间线的表的正确前缀,用正确的后缀动态构造表名(可能是动态的)的最佳方法是什么

    e、 g假设我想查询2017-01-10和2017-02-10之间的所有订单(订单上有orderPlacedTimestamp)——这意味着只扫描(和联合?)订单历史记录2017-01-10和订单历史记录2017-02-10表格。在这种情况下,在这两者之间执行如下操作:

    SELECT *
    FROM order_history_201701 UNION ALL
    SELECT *
    FROM order_history_201702
    WHERE order.orderPlacedTimestamp BETWEEN DATE(“2017–01-10”) and DATE(“2017-02-10”)
    
    然后,我可能会看到这样的场景:这些历史数据也需要与“实时”(流式)数据联合起来——以一种类似于关于lambda设计的文章的视图进行包装

  • 一个我没有想到的选择
  • BQ有这么多选项!:)

    无论如何,这是我目前的想法,在表设计和优化查询构造方面,任何关于这个主题的智慧之言都将受到极大的赞赏


    谢谢大家

    >我的建议是认真考虑

    的本地BigQu查询功能 虽然流式传输到分区表有一些限制(您可以在过去的30天内流式传输到分区,在未来相对于当前日期的5天内流式传输到分区),但对于加载或查询作业没有此类限制

    相对很久以前,我曾考虑使用此选项来解决按列划分而不是按日期划分的问题,方法是将一些属性映射到“0001-01-01”和“9999-12-31”之间的日期(3652058天-因此要划分的属性值不同)。POC在概念上是成功的,但我仍然不喜欢它,特别是谷歌团队有强大的承诺(至少当时我是这样认为的)来介绍它 桌子的另一边。我决定等这个

    和此同时,为了刷新并再次检查加载或查询到分区表中是否仍然没有分区特定的限制(正如在一篇文章中听起来的那样),我做了快速测试,您可以看到下面的结果

    步骤1创建分区表-
    项目.数据集.分区表
    我只是用UI来做这个

    步骤2-将查询结果插入表的不同分区

    #standardSQL
    SELECT 13 AS a
    
    以project.dataset.partitioned_表$YYYYMMDD作为目标 (您可以为此使用DML的INSERT)

    我在AC(0001-01-01)和?(9999-21-31)

    步骤3检查结果

    #standardSQL
    SELECT DATE(_partitiontime) AS partition_, a
    FROM `project.dataset.partitioned_table`
    ORDER BY a
    
    结果是(记住-分区的格式uu这里是YYYYMMDD)


    您能不能不简单地使用BigQuery的内置分区功能(您只看到一个表,但不需要支付完整表扫描的费用)——嗨,Graham,谢谢您的评论。除非我错过了一些关键功能(我现在会回到docos确认,也许我已经确认了!),分区是基于摄取/加载时间的,不适合我需要的历史“真实日期”分区。除非您可以在数据中设置一个自定义字段作为分区时间(例如orderPlacedTime-true event time),否则我看不到这种方法在这个用例中的值?但如前所述,我可能有这个错误,我会回去确认或不我的理解。再次感谢您的回复!:)您可以使用
    $YYYYMMDD
    表示法(分区装饰器)自己指定分区,从而将数据放入所需分区。我们使用这种技术来流式传输实时数据,并根据数据自身的时间字段将历史数据加载到正确的分区中。据我所知,你可以追溯到分区装饰最多1-2年,但不是6年。这是我在之前的一篇SO文章中读到的。所以这可能是不可靠的信息。这是真的。但是,有没有一些技术可以在附近工作呢
    partition_      a
    ----------      --
    2017-07-16      1
    2017-07-16      2
    2017-07-16      3
    2017-07-16      4
    2017-07-15      5
    2017-07-14      6
    2010-01-01      7
    2001-01-01      8
    1001-01-01      9
    0001-01-01      10
    4001-01-01      11
    7001-01-01      12
    9999-12-31      13