【问题标题】:How to create BigQuery view that preserves nested RECORD field如何创建保留嵌套 RECORD 字段的 BigQuery 视图
【发布时间】: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,它描述了如何在重复字段中进行查询,但没有显示如何以非扁平化的方式将它们呈现为视图。我正在尝试做的事情是否可能?

【问题讨论】:

    标签: sql google-bigquery google-cloud-platform


    【解决方案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%'
    )
    

    【讨论】:

      猜你喜欢
      • 2019-12-27
      • 2019-11-23
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多