MAPREDUCE服务 MRS-Flink SQL逻辑开发建议:聚合函数中case when语法改写成filter语法
聚合函数中case when语法改写成filter语法
在聚合函数中,FILTER是更符合SQL标准用于过滤的语法,并且能获得更多的性能提升。FILTER是用于聚合函数的修饰符,用于限制聚合中使用的值。
【示例】在某些场景下需要从不同维度来统计UV,如Android中的UV,iPhone中的UV,Web中的UV和总UV,这时可能会使用如下CASE WHEN语法。
- 修改前:
SELECT day, COUNT(DISTINCT user_id) AS total_uv, COUNT(DISTINCT CASE WHEN flag IN (android', "iphone'") THEN user_id ELSE NULL END) AS app_uv, COUNT(DISTINCT CASE WHEN flag IN(wap', 'other') THEN user_id ELSE NULL END) AS web_uv FROM T GROUP BY day
- 修改后:
SELECT day, COUNT(DISTINCT user_id) AS total_uv, COUNT(DISTINCT user_id) FILTER (WHERE flag IN ('android', 'iphone')) AS app_uv, COUNT(DISTINCT user_id) FILTER(WHERE flag IN ('wap', 'other'))AS web_uv FROM T GROUP BY day
Flink SQL优化器可以识别相同的distinct key上的不同过滤器参数。例如示例中三个COUNT DISTINCT都在user_id列上。Flink可以只使用一个共享状态实例,而不是三个状态实例,以减少状态访问和状态大小,在某些工作负载下可以获得显著的性能提升。
- GaussDB数据库SQL语法_SQL语法_CREATE_ALTER
- GaussDB(DWS)常用SQL_常用SQL命令_SQL语法
- 日志分析_日志结构化_日志格式化
- GaussDB(for MySQL)并行查询_GaussDB(for MySQL)内核_GaussDB(for MySQL)并行执行_PQ
- 什么是Spark SQL作业_数据湖探索DLISpark SQL作业
- GaussDB行转列_数据中台架构pdf_高斯数据库行转列_华为云
- MapReduce服务_什么是ClickHouse_如何使用ClickHouse
- 什么是Spark_如何使用Spark_Spark的功能是什么
- 什么是数据湖探索服务_数据湖探索DLI用途与特点
- GaussDB(DWS)服务_什么是IoT数仓_如何使用IoT数仓