Python 在保留记录结构的同时重复表

Python 在保留记录结构的同时重复表,python,google-bigquery,Python,Google Bigquery,我有一个每周的流程,在几个表上执行完全替换操作。这个过程是每周进行的,因为作为一个整体,有大量的数据。然而,我们也希望每天/每小时进行增量更新,这样系统将与生产更加同步 当我们更新数据时,我们正在创建行的副本,并更新现有行,我希望将其删除。为了实现这一点,我编写了一个python脚本,它在一个表上运行以下查询,并将结果插入其中: QUERY = """#standardSQL select {fields} from (

我有一个每周的流程,在几个表上执行完全替换操作。这个过程是每周进行的,因为作为一个整体,有大量的数据。然而,我们也希望每天/每小时进行增量更新,这样系统将与生产更加同步

当我们更新数据时,我们正在创建行的副本,并更新现有行,我希望将其删除。为了实现这一点,我编写了一个python脚本,它在一个表上运行以下查询,并将结果插入其中:

QUERY = """#standardSQL
            select {fields}
            from (
              select *
              , max(record_insert_time) over (partition by id) as max_record_insert_time
              from {client_name}_{environment}.{table} as a
            )
            where 1=1
            and record_insert_time = max_record_insert_time"""
{fields}变量替换为表中所有列的列表;我不能在这里使用*,因为这只适用于1次运行,下一次运行将已经有一个名为max_record_insert_time的字段,这将导致歧义问题

一切正常,但有一个例外——表中的一些列是记录数据类型;尽管没有为它们使用别名,并且选择了它们的完全限定名,例如record_name.child_name,但当将输出写回表中时,结果是平坦的。我已经在代码中添加了flattresults:False配置,但这并没有改变结果


我很想听听关于如何使用我现有的计划、其他重复数据消除方法或其他处理增量更新的方法来解决此问题的想法。

也许您可以在外部声明中使用

选择*除最大记录插入时间外

这应该保持准确的记录结构。有关更多详细文档,请参阅


另一种方法是只在{fields}中包含顶级列,即使它们是非叶子,也可以只记录_name而不记录_name.*

也许您可以在外部语句中使用

选择*除最大记录插入时间外

这应该保持准确的记录结构。有关更多详细文档,请参阅


另一种方法是只在{fields}顶层列中包含,即使它们是非叶子,即只记录_name而不记录_name.*

下面的答案肯定不比使用直接的修饰符好,但希望呈现另一种版本

选择t* 从…起 选择 id,最大记录插入时间作为最大记录插入时间, 数组\u聚合为\u id的所有\u记录\u 从yourTable中按id分组 ,将id为t的所有记录重新启动 其中t.record\u insert\u time=最大记录\u insert\u时间 按id订购 上面的查询所做的是-首先将每个id的所有记录与insert_time的最大值一起分组到相应行的数组中。然后,对于每个id,它只是将所有以前聚合的行展平,并仅拾取插入时间与最大时间匹配的行。结果如预期。不涉及,但相当简单。但是额外使用。。。
仍然-至少不同的选项:下面的答案肯定不比使用直接的修改器好,但希望给出替代版本

选择t* 从…起 选择 id,最大记录插入时间作为最大记录插入时间, 数组\u聚合为\u id的所有\u记录\u 从yourTable中按id分组 ,将id为t的所有记录重新启动 其中t.record\u insert\u time=最大记录\u insert\u时间 按id订购 上面的查询所做的是-首先将每个id的所有记录与insert_time的最大值一起分组到相应行的数组中。然后,对于每个id,它只是将所有以前聚合的行展平,并仅拾取插入时间与最大时间匹配的行。结果如预期。不涉及,但相当简单。但是额外使用。。。
仍然-至少有不同的选择:o

天哪!这是唯一的BQ功能吗?以前从未遇到过这种语法!在文档中也看不到。你可以读一下。天哪!这是唯一的BQ功能吗?以前从未遇到过这种语法!在文档中也看不到。你可以阅读。这是一个有趣的方法。小说明-根据我使用BigQuery的经验,当一个人给一个表加上别名并使用表别名执行选择时,不使用第二个别名来重命名所选列,例如t.field vs t.field as field,输出将始终与每个字段名保持一致。然而,我的经验主要局限于遗留SQL,因此在标准SQL中可能处理方式有所不同。不是这样吗?这对于遗留sql是正确的。但在标准sql中,没有添加t_。因此,您将获得完全原始的结构/命名这是一种有趣的方法。小说明-根据我使用BigQuery的经验,当一个人给一个表加上别名并使用表别名执行选择时,不使用第二个别名来重命名所选列,例如t.field vs t.field as field,输出将始终与每个字段名保持一致。然而,我的经验主要局限于遗留SQL,因此在标准SQL中可能处理方式有所不同。不是这样吗?这对于遗留sql是正确的。但在标准sql中,没有添加t_。因此,您将获得完全原始的结构/命名