如何展平具有多个重复字段的 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')
我正在尝试查询应用引擎数据存储备份数据。在 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')