在BigQuery中处理记录、结构和数组而不将其扁平化,可以通过以下几种方式实现:
假设我们有一个包含用户信息的表,每个用户有多个联系方式,并且每个联系方式包含电话号码和电子邮件地址。
CREATE TABLE users (
user_id INT64,
name STRING,
contacts ARRAY<STRUCT<phone STRING, email STRING>>
);
INSERT INTO users (user_id, name, contacts)
VALUES
(1, 'Alice', [{'phone': '123-456-7890', 'email': 'alice@example.com'}, {'phone': '098-765-4321', 'email': 'alice.work@example.com'}]),
(2, 'Bob', [{'phone': '111-222-3333', 'email': 'bob@example.com'}]);
SELECT
user_id,
name,
contacts.phone,
contacts.email
FROM
users,
UNNEST(contacts) AS contacts;
原因:使用UNNEST
函数会将数组展开为多行,导致结果扁平化。
解决方法:如果不想扁平化结果,可以直接查询数组字段而不使用UNNEST
。
SELECT
user_id,
name,
contacts
FROM
users;
原因:嵌套结构和数组可能导致查询语句变得复杂。
解决方法:可以使用嵌套的SELECT
语句或JSON_EXTRACT
函数来处理嵌套数据。
SELECT
user_id,
name,
(SELECT ARRAY(SELECT AS STRUCT phone, email FROM UNNEST(contacts))) AS filtered_contacts
FROM
users;
通过合理使用记录、结构和数组,可以在BigQuery中有效地管理和查询复杂数据结构,同时避免数据扁平化带来的不便。根据具体需求选择合适的数据类型和查询方法,可以提高数据处理的效率和灵活性。
领取专属 10元无门槛券
手把手带您无忧上云