如何创建保留嵌套 RECORD 字段的 BigQuery 视图
Posted
技术标签:
【中文标题】如何创建保留嵌套 RECORD 字段的 BigQuery 视图【英文标题】:How to create BigQuery view that preserves nested RECORD field 【发布时间】:2017-05-18 19:17:26 【问题描述】:我有一个具有此架构的 BigQuery 表:
|- actorEmail: string (required)
|- actorCallerType: string (required)
+- baseOUs: record (repeated)
| |- baseOU: string
|- time: timestamp (required)
|- uniquequalifier: integer (required)
|- ipAddress: string (required)
|- EventType: string (required)
|- EventName: string (required)
+- parameter: record (repeated)
| |- name: string
| |- value: string
我想用这个查询创建一个视图:
SELECT actorEmail,actorCallerType,time,uniquequalifier,ipAddress,EventType,EventName,parameter
FROM <table>
WHERE baseOUs CONTAINS "/US"
这不起作用,因为您无法查询多条记录(尽管有一种解决方法)。但是,使用解决方法,它会使我不想发生的参数字段变平。
一般的想法是视图应该包含除了重复字段'baseOUs'之外的所有字段,只显示baseOUs中带有“/US”的记录,并且它不会展平参数字段。有了这样的视图,我可以将 ACL 应用到新视图,并仅授予美国用户对数据的访问权限,对每个在此表中有数据的国家/地区都授予访问权限。
根据this article,这可以通过 API 使用 flattenResults=false 属性来实现。但是,我想在 UI 中以视图的形式执行此操作,而不是通过 API。
还遇到了this article,它描述了如何在重复字段中进行查询,但没有显示如何以非扁平化的方式将它们呈现为视图。我正在尝试做的事情是否可能?
【问题讨论】:
【参考方案1】:确保在创建视图时启用standard SQL,查询时也需要使用标准SQL。您可以将视图定义为:
SELECT
actorEmail,
actorCallerType,
time,
uniquequalifier,
ipAddress,
EventType,
EventName,
parameter
FROM `your-project.your_dataset.your_table`
WHERE EXISTS (
SELECT 1
FROM UNNEST(baseOUs)
WHERE baseOU LIKE '%/US%'
);
这将保留表的原始结构,同时仅包括baseOUs
中的条目之一包含/US
的行。您可以在migration guide 中阅读有关旧版 SQL 和标准 SQL 之间的更多区别。
【讨论】:
感谢您的快速回复。不幸的是,它不起作用:错误:无法解析表名:缺少数据集名称。我认为它指的是子查询? 确保使用your-project.your_dataset.your_table
形式的表名,其中名称用反引号括起来。
我取消选中“使用旧版 SQL”,然后删除了 [] 和项目名称,因此它只是 dataset.tablename 并且做到了。非常感谢!!
如果这为您解决了问题,请accept and consider upvoting the answer。谢谢!
我以为是这样,但是当我尝试保存视图时,它向我展示了这个错误:保存视图失败。坏表引用“gsuiteactivities.admin_events_with_ous_as_records”;标准 SQL 视图中的表引用需要明确的项目 ID Dismiss。看来我无法使用项目 ID 运行查询,并且我无法保存没有项目 ID 的视图。【参考方案2】:
以下是 BigQuery 标准 SQL
#standardSQL
SELECT * EXCEPT(baseOUs)
FROM <table>
WHERE EXISTS (
SELECT 1 FROM UNNEST(baseOUs)
WHERE baseOU LIKE '%/US%'
)
【讨论】:
以上是关于如何创建保留嵌套 RECORD 字段的 BigQuery 视图的主要内容,如果未能解决你的问题,请参考以下文章
如何将嵌套的 Avro 字段作为单个字段复制到 Redshift?
如何在 Active Record 迁移中为字段添加索引以加快查询速度?