如何创建保留嵌套 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?

我应该如何在不破坏嵌套的情况下过滤 RECORD 中的列?

如何在 Active Record 迁移中为字段添加索引以加快查询速度?

如何根据多个by-record标准从data.table中提取特定字段?

graphql 突变不返回嵌套字段

根据 BigQuery 中嵌套字段的不同值选择行