Impala vs. Presto简要对比梳理
腾讯灯塔产品相关介绍文档:
SQL模式下的第一个tab【查询结果】右边的帮助提示信息如下:
① 请确保在SQL查询语句末尾带上limit条件,否则页面默认显示前5000条结果;
② Impala SQL语法指南 (查询托管在灯塔集群的数据需使用)
③ OneSQL 语法指南 (跨源查询模式需使用)
腾讯灯塔 DataTalk 没有固定的语法,是按查询的数据源SQL语法。
旧日报(Impala)
旧的 DataTalk 页面是引用的灯塔融合引擎(DataInsight的数据源),对应 Impala SQL
语法。
核心语法
主要用到 IF、CASE、IN、BETWEEN、CAST、AVG、COUNT 等关键字。
- Arithmetic Operators
- BETWEEN Operator
- Comparison Operators:
=
,!=
,<>
;<
,<=
,>
,>=
。 - EXISTS Operator
- ILIKE Operator
- IN Operator
- IREGEXP Operator
- IS DISTINCT FROM Operator
- IS NULL Operator
- IS TRUE Operator
- LIKE Operator
- Logical Operators:
AND
、OR
、NOT
- REGEXP Operator
- RLIKE Operator
- CASE
- CASE2
- COALESCE
- DECODE
- IF
- IFNULL
- ISFALSE
- ISNOTFALSE
- ISNOTTRUE
- ISNULL
- ISTRUE
- NONNULLVALUE:等效于
IS NOT NULL
。 - NULLIF
- NULLIFZERO
- NULLVALUE:等效于
IS NULL
。 - NVL
- NVL2
- ZEROIFNULL
时间范围
recent_7_days
是DataTalk中拖入的时间范围交互组件定义的变量。
在辅助画布中,可以看到拖入了两个时间范围交互组件:
点击进入【最近7天】组件的设置(⚙️),可以修改变量字段类型、变量KEY、变量名以及组件配置(默认取值)。
- 变量字段类型:
YYYYMMDDHH整形
,注意SQL中要将时间戳变量的类型转换对齐,才能使用 BETWEEN 进行日期比较。 - 变量KEY、变量显示名 可以自定义。可在SQL中引用变量KEY,start、end分别表示起、止整点时间。
- 组件配置(默认组织):最近7天。
点击顶部工具栏中的【变量池】,在【系统变量】中可以看到时间范围组件变量KEY——recent_7_days
。
时间转换
Impala Date and Time Functions
- impala系列: 时间函数
- FROM_TIMESTAMP IN APACHE IMPALA
- extract the date from a timestamp value variable in Impala
Impala Date and Time Functions 中支持字符串强转时间戳类型:cast('2016-01-31' as timestamp)
。
JSON解析
Impala Miscellaneous Functions
GET_JSON_OBJECT
(STRING json_str, STRING selector)
Purpose: Extracts JSON object from the
json_str
based on the selector JSON path and returns the string of the extracted JSON object.
The function returnsNULL
if the input json_str is invalid or if nothing is selected based on the selector JSON path.
相关参考:
- impala 解析json
- Impala JSON函数
- Impala解析JSON字符串
- Nested JSON to columns using Impala SQL function
- get_json_object() - parsing a json string in Impala - Unable to parse the key starting with a number
例如解析 value 中的 cmd 和 retcode 字段:
- GET_JSON_OBJECT(value, ‘$.cmd’)
- GET_JSON_OBJECT(value, ‘$.retcode’)
新日报(Presto)
新的 DataTalk 页面引用的是扩展TDW数据源,则使用的是 Presto SQL
。
核心语法
需查询 Presto SQL 与 Impala SQL 中的 IF、CASE、IN、BETWEEN、CAST、AVG、COUNT 等关键字对应语法。
cast、json解析,有点类似 CLS日志查询语法,可参考监控告警方案 - CLS告警策略存档中的相关实践。
常用语法:
Comparison Functions and Operators:
- Comparison Operators:
<
、>
、<=
、>=
、=
、<>
、!=
(non-standard)。 - Range Operator: BETWEEN
- IS NULL and IS NOT NULL
- IS DISTINCT FROM and IS NOT DISTINCT FROM
- GREATEST and LEAST
- Quantified Comparison Predicates: ALL, ANY and SOME
- LIKE
- cast、try_cast
- count、count_if
- max、min、avg
条件语句:
if(condition, true_value, false_value)
基于 CASE WHEN 的等效实现:
CASE
WHEN condition THEN true_value
[ ELSE false_value ]
END
其他参考:
t-sql操作符中,不等号(!=,<>)查询出来的结果集不包含有当前字段为 null 的数据。
时间范围
参考旧日报,在辅助画布中,拖入了时间范围交互组件,并定义变量KEY。
时间转换
毫秒级时间戳换算成秒级:
FLOOR(CAST(f_report_time AS BIGINT) / 1000)
,floor取整秒,忽略毫秒。
presto vs hive 时间转换:@csdn @zhihu
Date and Time Functions and Operators
- presto时间相关的函数
- Convert Timestamp To Date With Presto - Ahana
- Presto SQL - Converting a date string to date format
相关函数:
format_datetime
目前,医典正式环境性能上报(formal-yidianperformance)对 f_report_time
字段在 th 和 CLS 开启了筛选、索引, f_log_time
字段未开启。
如果在 th 上对 f_log_time
字段开启了筛选,在CLS日志主题索引配置开启了索引,则可以直接引用 f_log_time
字段。
- 毫秒级时间戳
f_report_time
转换为秒级,注意 /1000 将得到浮点数,可以调用FLOOR
函数取整或 CAST AS BIGINT 强转取整(四舍五入)。
FLOOR(CAST(f_report_time AS BIGINT) / 1000) AS tss,
CAST(CAST(f_report_time AS BIGINT) / 1000 AS BIGINT) AS tss,
- 如果
f_log_time
字段有缺失,可以基于f_report_time
转换为秒级时间戳,再依次调用 from_unixtime - format_datetime 按指定日期格式输出字符串。
-- 1666805107976 -> 2022-10-26 17:25:07
format_datetime(from_unixtime(CAST(f_report_time AS BIGINT)/1000),'yyyy-MM-dd HH:mm:ss')
JSON解析
8.12. JSON Functions and Operators:
is_json_scalar
json_array_contains
json_array_get
json_array_length
json_extract
(json, json_path) → jsonjson_extract_scalar
(json, json_path) → varchar
例如解析 value 中的 cmd 和 retcode 字段:
json_extract_scalar(json_extract(f_extra, '$.value'), '$.cmd')
json_extract_scalar(f_extra, '$.value.retcode')
对空对象的正确判断是 is null 或 is not null,兼顾空对象(null)和空字符串的完整判断为:
json_extract_scalar(f_extra, '$.value.error') is null or length(json_extract_scalar(f_extra, '$.value.error')) < 1) as count_success_ssrenter
其他参考
揭秘腾讯大数据之平台综述篇
TDW开源:腾讯的分布式数据仓库
从TDW到ClickHouse的最佳实践
TDW与PostgreSQL数据互访问功能
PostgreSQL在腾讯数据仓库TDW的使用教程
「解耦」方能「专注」——腾讯天穹SuperSQL跨引擎计算揭秘