【问题标题】:How to flatten bigquery record with multiple repeated fields?如何用多个重复字段展平 bigquery 记录?
【发布时间】:2016-02-26 02:34:05
【问题描述】:

我正在尝试查询应用引擎数据存储备份数据。在 python 中,实体是这样描述的:

class Bar(ndb.Model):
    property1 = ndb.StringProperty()
    property2 = ndb.StringProperty()

class Foo(ndb.Model):
    bar = ndb.StructuredProperty(Bar, repeated=True)
    baz = ndb.StringProperty()

不幸的是,当Foo 得到backed up and loaded into bigquery 时,表架构被加载为:

bar             |  RECORD  |  NULLABLE
bar.property1   |  STRING  |  REPEATED
bar.property2   |  STRING  |  REPEATED
baz             |  STRING  |  NULLABLE

我想做的是获取所有bar.property1 和关联bar.property2 的表格,其中baz = 'baz'

有没有一种简单的方法来展平Foo,以便将条形记录“压缩”在一起?如果这不可行,是否有其他解决方案?

【问题讨论】:

    标签: google-bigquery google-app-engine-python


    【解决方案1】:

    正如@Mosha 在评论中所暗示的那样,大查询似乎支持用户定义函数 (UDF)。您可以在 Web UI 上的UDF Editor 选项卡中输入它。在这种情况下,我使用了类似的东西:

    function flattenTogether(row, emit) {
      if (row.bar && row.bar.property1) {
        for (var i=0; i < row.bar.property1.length; i++) {
          emit({property1: row.bar.property1[i],
                name: row.bar.property2[i]});
        }
      }
    };
    
    bigquery.defineFunction(
      'flattenBar',
      ['bar.property1', 'bar.property2'],
      [{'name': 'property1', 'type': 'string'},
       {'name': 'property2', 'type': 'string'}],
      flattenTogether);
    

    然后查询看起来像:

    SELECT
      property1,
      property2,
    FROM
      flattenBar(
      SELECT
        bar.property1,
        bar.property2,
      FROM
        [dataset.foo]
      WHERE
        baz = 'baz')
    

    【讨论】:

      【解决方案2】:

      由于 baz 没有重复,您可以在 WHERE 子句中简单地对其进行过滤,而无需任何展平:

      SELECT bar.property1, bar.property2 FROM t WHERE baz = 'baz'
      

      【讨论】:

      • 我收到Error: Cannot output multiple independently repeated fields at the same time.
      • 您能否将查询选项“Flatten Results”设置为 false
      • 如果没有设置输出表(至少不在 Web UI 中)——这对于对数据的即席查询来说是不可取的。
      • 是的,不展平需要目标表。因此,要么您使用 Javascript TVF 将这些字段压缩在一起,要么单独询问为什么加载数据存储备份会使它们重复重复,而不是创建 bar 作为重复记录。
      • 太棒了。 Javascript UDF 似乎正在工作。我会把它写下来作为后代的答案。 (我觉得我不可能是唯一一个有这个问题的人)......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 2019-02-28
      • 2019-08-19
      相关资源
      最近更新 更多