Impala vs. Presto简要对比梳理

文章目录

    • 旧日报(Impala)
      • 核心语法
      • 时间范围
      • 时间转换
      • JSON解析
    • 新日报(Presto)
      • 核心语法
      • 时间范围
      • 时间转换
      • JSON解析
    • 其他参考

腾讯灯塔产品相关介绍文档:

  • 腾讯灯塔产品文档
  • DataTalk:开放的通用BI可视化平台
  • 腾讯灯塔DataTalk——如同乐高,这是一个开放/自由的数据可视化世界

SQL模式下的第一个tab【查询结果】右边的帮助提示信息如下:

① 请确保在SQL查询语句末尾带上limit条件,否则页面默认显示前5000条结果;
② Impala SQL语法指南 (查询托管在灯塔集群的数据需使用)
③ OneSQL 语法指南 (跨源查询模式需使用)

腾讯灯塔 DataTalk 没有固定的语法,是按查询的数据源SQL语法。

旧日报(Impala)

旧的 DataTalk 页面是引用的灯塔融合引擎(DataInsight的数据源),对应 Impala SQL 语法。

  • Data Types
  • Impala SQL Language Reference
  • Impala Built-In Functions

核心语法

主要用到 IF、CASE、IN、BETWEEN、CAST、AVG、COUNT 等关键字。

SQL Operators:

  • 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:ANDORNOT
  • REGEXP Operator
  • RLIKE Operator

Impala Conditional Functions:

  • 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、变量名以及组件配置(默认取值)。

  1. 变量字段类型YYYYMMDDHH整形,注意SQL中要将时间戳变量的类型转换对齐,才能使用 BETWEEN 进行日期比较。
  2. 变量KEY变量显示名 可以自定义。可在SQL中引用变量KEY,start、end分别表示起、止整点时间。
  3. 组件配置(默认组织):最近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 returns NULL 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

  • Data Types
  • Presto Documentation
  • DataTalk - 跨源查询语法介绍
  • presto函数大全中文版

核心语法

需查询 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

Conditional Expressions:

  • CASE
  • IF
  • COALESCE
  • NULLIF:等效于 val1 = val2 ? null : val1
  • TRY

Conversion Functions

  • cast、try_cast

Aggregate Functions:

  • count、count_if
  • max、min、avg

SELECT

  • UNION | INTERSECT | EXCEPT Clause
  • Joins

条件语句

if(condition, true_value, false_value) 基于 CASE WHEN 的等效实现:

CASE
    WHEN condition THEN true_value
    [ ELSE false_value ]
END

其他参考

关于SQL命令中不等号(!=,<>)

t-sql操作符中,不等号(!=,<>)查询出来的结果集不包含有当前字段为 null 的数据。

Presto的IN条件语句的实现逻辑是限定范围查询

时间范围

参考旧日报,在辅助画布中,拖入了时间范围交互组件,并定义变量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 字段。

  1. 毫秒级时间戳 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,
  1. 如果 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解析

  • hive与presto解析json中的字段值
  • 【Hive】解析json(get_json_object)

8.12. JSON Functions and Operators:

  • is_json_scalar
  • json_array_contains
  • json_array_get
  • json_array_length
  • json_extract(json, json_path) → json
  • json_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跨引擎计算揭秘

你可能感兴趣的:(数据库,数据库)