ITPub博客

首页 > 数据库 > > 如何在BigQuery中使用嵌套数据

如何在BigQuery中使用嵌套数据

作者:u_9ff4c058a0e0 时间:2022-04-02 16:46:10 0 删除 编辑
作者|Christianlauer
编译|VK
来源|Towards Data Science
原文链接:https://towardsdatascience.com/how-to-work-with-nested->

云数据和仓库正在崛起——谷歌的BigQuery就是一个例子。

BigQuery是最强大的非规范化数据。与使用星型或雪花型模式等传统模式不同,你应该取消数据规范化,并使用嵌套和循环列。这些列可以保留关系,而不会像关系模式或规范化模式那样降低性能[1]。

什么是嵌套数据

BigQuery支持从支持基于对象的模式(例如JSON)的源格式加载和查询嵌套的和循环的数据。

address列包含一个值数组。数组中的不同地址是循环数据。每个地址中的不同字段是嵌套数据。

实例

对于BigQuery的示例演练,我使用了geo_openstreetmap数据集中的planet_features特征。在这里,数据是以嵌套格式存储的,让我们看一下:

SELECT * FROM `bigquery-public-data.geo_openstreetmap.planet_features` LIMIT 1000

这是以下输出的结果:

结果一目了然。与经典的关系数据库不同,我可以使用数组并保存额外的列。而且,整件事的表现非常出色。现在,我想在德国找一家超市-应该有一个简单的where从句:

SELECT * 
FROM   `bigquery-PUBLIC-   data.geo_openstreetmap.planet_features` 
WHERE  'Netto' IN 
       ( 
              SELECT value 
              FROM   unnest(all_tags)) 
AND    ( 
              'addr:country', 'DE') IN 
       ( 
              SELECT (KEY, value) 
              FROM   unnest(all_tags)) 
AND    ( 
              'addr:city', 'Hamburg') IN 
       ( 
              SELECT (KEY, value) 
              FROM   unnest (all_tags));

从而产生所需的输出:

使用unnest功能,你还可以展平数据,因此查询的输出:

SELECT osm_id,tags
FROM bigquery-public-data.geo_openstreetmap.planet_features,
UNNEST(all_tags) as tags limit 100

在BigQuery中处理嵌套数据并希望查询某些数据时,这几乎是你必须知道的最重要的一点。但是,如果你想将数据用于进一步的ETL过程,将数据存储在关系数据库中,或者需要键值对作为分类器的属性,该怎么办?在这里,你希望数据不会变平—因为这将导致重复的行—在这里,你希望数组中的键值对作为新列:

SELECT 
       ( 
              SELECT osm_id) osmid, 
       ( 
              SELECT value 
              FROM   Unnest(all_tags) 
              WHERE  KEY = "Address") AS address, 
       ( 
              SELECT value 
              FROM   Unnest(all_tags) 
              WHERE  KEY = "name") AS NAME, 
       ( 
              SELECT value 
              FROM   Unnest(all_tags) 
              WHERE  KEY = "opening_hours") AS opening_hours, 
       ( 
              SELECT value 
              FROM   Unnest(all_tags) 
              WHERE  KEY = "organic") AS organic, 
       ( 
              SELECT geometry) AS geometry, 
FROM   bigquery-PUBLIC-data.geo_openstreetmap.planet_features 
WHERE  ( 
              'Edeka' IN 
              ( 
                     SELECT value 
                     FROM   unnest(all_tags)) 
       OR     'Rewe' IN 
              ( 
                     SELECT value 
                     FROM   unnest(all_tags)) 
       OR     'Netto' IN 
              ( 
                     SELECT value 
                     FROM   unnest(all_tags))) 
AND    ( 
              'addr:country', 'DE') IN 
       ( 
              SELECT (KEY, value) 
              FROM   unnest(all_tags)) - 
AND   ( 
              'addr:city', 'Hamburg') IN 
       ( 
              SELECT (KEY, value) 
              FROM   unnest(all_tags));

结论

在我第一次接触到嵌套数据之后——我不得不承认,我一开始不知道该怎么处理它。

但我意识到,在新的世界里,这样的数据格式是正常的,也是通往非结构化数据世界的途径。新系统通过基于列的数据库提供极高的计算能力和快速的结果。通过以上示例,你应该能够很好地查询和处理大多数嵌套数据用例。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69999831/viewspace-3127917/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2022-02-11

  • 博文量
    1828
  • 访问量
    20598