如何展平具有多个重复字段的 bigquery 记录?

How to flatten bigquery record with multiple repeated fields?

我正在尝试查询应用引擎数据存储备份数据。在 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 时,table 模式被加载为:

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

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

有没有一种简单的方法可以将 Foo 展平,使条形记录 "zipped" 在一起?如果那不行,还有其他解决方案吗?

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

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

正如@Mosha 在评论中暗示的那样,大查询似乎支持用户定义函数 (UDF)。您可以在网络 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')