为了账号安全,请及时绑定邮箱和手机立即绑定

BigQuery管道语法——简化SQL查询的新手之旅

简介:

SQL 已经是数据管理的支柱几十年了。它声明式风格让你描述需要的内容,数据库系统则处理其余部分。然而,随着数据处理日益复杂,SQL 的僵化结构和冗长性可能会成为瓶颈,常常导致难以阅读、调试和维护的复杂嵌套查询。

进入GoogleSQL的管道语法功能,这是改变游戏规则的存在。它旨在简化查询构建过程,提供了一个逻辑清晰、逐步构建的方法,让使用者不再受限于传统SQL语法。

标准SQL:的困境

传统SQL的执行顺序是固定的。
FROM → WHERE → GROUP BY → ORDER BY → SELECT

尽管功能上可行,这种顺序并不总是符合我们逻辑上的问题解决方式。此外,SQL 经常需要子查询,导致嵌套结构很深,开发人员戏称为“倒序流”。调试这样的查询可不容易。

什么是管道符号?

管道语法重新构想了 SQL,允许你将操作,如过滤、分组和选择等,以线性序列连接起来。可以将其视为一个逐步展开的逻辑过程。该语法类似于流行的 PySpark 和 Pandas 数据操作库,对于熟悉这些工具的开发人员来说,这种语法很容易上手。

你可以在我的YouTube视频中了解更多关于管道语法知识

管道语法的关键特点

在我们深入之前,我们先来看看这个样本数据集吧。这是BigQuery公共数据中一个纽约出租车行程的样本数据。我们将用这个表来了解管道语法的各种概念。

出租车行程示例数据

表格的元数据信息。请注意,它是按照行程日期进行分区的。

这里有一些带有实际示例的管道符常用操作:

1.: 筛选行.

从 `coastal-throne-433510-a5.partitioned_data.taxi_trips_date_partitioned` 表中  
| WHERE trip_miles > 5,  
| WHERE trip_date = '2023-07-11';

这会筛选出行距离超过5英里并且发生在某个特定日期的行程。

2. 数据聚合

    FROM `沿海王座-433510-a5.partitioned_data.taxi_trips_date_partitioned`
    |> AGGREGATE SUM(fare) AS total_fare GROUP BY payment_type;
    -- 计算每个支付类型下的总车费

计算每种支付方式的总金额。

3. 添加新列

FROM `coastal-throne-433510-a5.partitioned_data.taxi_trips_date_partitioned`   
|> 增加 trip_seconds / 60 AS 行程分钟;

注:此操作将行程秒数转换为行程分钟。

添加一个新的列,trip_minutes,将行程秒转换成分钟。

4.: 重命名列

    在 `coastal-throne-433510-a5.partitioned_data.taxi_trips_date_partitioned`  
    |> 重命名为 trip_miles 到 distance_miles;

使列名更直观易懂。

5. 数据采样

从以下SQL查询中,从 coastal-throne-433510-a5.partitioned_data.taxi_trips_date_partitioned
|> 取10%的样本数据;


随机抽取数据集中的10%记录。

**6\. 数据去扁平化**

coastal-throne-433510-a5.partitioned_data.taxi_trips_date_partitioned 数据集开始,使用解构操作将季度计数展开为单独的列:
|> 解构(trip_count
对季度 IN (trip_count_Q1, trip_count_Q2,
trip_count_Q3, trip_count_Q4
)
);

注释:`partitioned_data` 表示分区数据。

把列转成行,这样季度数据分析就更简单了。

**7\. 连接表格**
 FROM `coastal-throne-433510-a5.partitioned_data.taxi_trips_date_partitioned` AS taxi_trips  
|> 左连接 (  
    SELECT '153ba837...' AS unique_key, 22.5 AS additional_fees  
    UNION ALL  
    SELECT '8d563474...' AS unique_key, 18.0 AS additional_fees  
  ) AS taxi_fare_data  
  ON taxi_trips.unique_key = taxi_fare_data.unique_key  
|> WHERE trip_date = '2023-06-29'  
|> SELECT taxi_trips.unique_key, fare, additional_fees;


/* 
行程日期为 '2023-06-29' 的行程中,选择出租车行程唯一键和费用。 
*/

# **管道操作的好处**

* **提高可读性**:查询简洁且逻辑清晰,模仿我们的思维方式。
* **熟悉度**:感觉就像使用 PySpark 或 Pandas,降低了学习曲线。
* **互操作性**:与标准 SQL 无缝集成,可以轻松协作。

# **限制:**

* **无直接差分隐私支持**:你不能直接在管道查询中使用差分隐私。
* **暂不支持命名窗口**:管道语法暂时不支持命名窗口。
* **采用难题**:传统SQL有庞大的用户群体,改变习惯需要时间。

# **为什么应该使用管道符号?**

管道语法让SQL焕然一新。它改变了我们处理数据查询的方法,使代码更加整洁、易于维护。如果你曾经为复杂的SQL头疼过,这是尝试更简单方法的绝佳机会。

# **最后的思考**

GoogleSQL的管道语法不仅是一个新功能,它还是一种新方法,更贴合现代数据工作流程。试试看,感受一下它的不同之处。在评论中和我分享一下你的想法!

# 文档资料

1. Google 官方文档: <https://cloud.google.com/bigquery/docs/pipe-syntax>
2. 同样,Axel Thevenot 🐣 撰写的另一篇精彩文章关于管道符号的用法:[更多内容请参阅](https://medium.com/google-cloud/google-pipe-syntax-modernizing-sql-without-sacrificing-its-strengths-78b6e8177648)

关注我在 LinkedIn 和 Medium 上的动态,获取更多类似的内容!
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消