首页 > 数据库 > > 如何在BigQuery中使用嵌套数据
作者|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/ ,如需转载,请注明出处,否则将追究法律责任。