【大数据】Presto(Trino)SQL 语法进阶

这篇具有很好参考价值的文章主要介绍了【大数据】Presto(Trino)SQL 语法进阶。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

Presto(Trino)是一个快速、分布式的SQL查询引擎,可以用于查询各种数据源,包括Hadoop、NoSQL、关系型数据库等。下面是Presto(Trino)SQL语法的概述:

它支持标准SQL语法,包括以下SQL命令:

  • SELECT:用于从一个或多个表中检索数据,指定所需的列和过滤条件。

  • FROM:用于指定要查询的表名、子查询或视图,这些源可能跨越数据库和表格。

  • JOIN:用于将两个或多个表格中的列连接到单个结果集中。

  • WHERE:用于指定WHERE子句中定义的条件,以从原始数据集中筛选数据。

  • GROUP BY:用于根据一个或多个列对结果集进行分组。

  • HAVING:用于对GROUP BY后的结果集应用过滤器来定义筛选条件。

  • ORDER BY:用于根据一个或多个列对结果集进行排序。

  • LIMIT:用于限制查询结果集的行数。

除了标准SQL命令外,Presto(Trino)还支持多种内置函数,如聚合函数、字符串函数、日期函数等。此外,它还支持复杂的窗口函数和嵌套查询以及联合查询。这些高级功能可以帮助用户更轻松地处理大数据集,并快速查询所需的数据。

trino数据库,大数据,Presto,SQL,大数据,presto,trino,sql
前面也讲解了一部分SQL语法,建议先查阅我上一篇文章:【大数据】Presto(Trino)配置参数以及 SQL语法,这里只是正对上一篇文章的一些补充。

二、环境准备

如已经有环境了,可以忽略,如想快熟部署Presto(Trino)环境可参考我这篇文章:【大数据】通过 docker-compose 快速部署 Presto(Trino)保姆级教程

docker exec -it trino-coordinator bash

# --catalog:数据源 --schema:数据库
${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop

三、Trino 系统库表的讲解

Presto(Trino)系统库表是用于管理和查询Presto(Trino)系统元数据的特殊表格。这些表格位于系统库(system)中,可容易地查询并返回有关Presto(Trino)集群、数据库、表和列的元数据信息。system 源数据下有:information_schemajdbcmetadataruntime,下面将一一讲解。

1)information_schema

information_schema是一个标准化的数据库元数据信息架构,用于在关系型数据库中存储信息,例如表、列、索引、约束、列类型、用户等。

Presto(Trino)支持information_schema元数据架构,可以用于查询表和列信息、数据类型、约束、索引、用户权限等。

以下是information_schema中一些常见表名称及其描述,以下就是Presto(Trino)system.information_schema中的表:

  • applicable_roles:列出了当前会话用户所属的所有角色信息,包括角色名称、拥有者和角色状态等。如果当前会话用户没有被分配任何角色,则applicable_roles表将返回空结果集。

  • columns:列出数据库中每个表格的列信息,例如名称、数据类型、可否为空等。

  • enabled_roles:用于列出当前会话用户被授予的、激活的所有角色信息。

  • roles:用于列出所有可用角色的详细信息,包括角色名称、拥有者和是否可用等。

  • schemata:列出数据库中所有模式的信息,例如名称、所有者等。

  • table_privileges:用于列出与表和视图相关的所有权限的详细信息,包括授予的角色和权限等。

  • tables:列出数据库中所有表格的信息,例如名称、模式、所属拥有者等。

  • views:列出数据库中所有视图的信息,例如名称、所属模式、列信息等。

使用information_schema,用户可以轻松地查询数据库元数据,从而进行数据库管理和查询优化。稍微了解以下即可。

2)jdbc

Trino(以前称为Presto)提供了一个名为system.jdbc的内置系统表,该表提供了与JDBC连接有关的信息。

system.jdbc包含以下表:attributescatalogcolumnsprocedure_columnsprocedurespseudo_columnsschemassuper_tablessuper_typestable_typestablestypesudts,可以用来查询已连接的数据库的表和视图的元数据。

以下是一个system.jdbc查询的示例:

SELECT * FROM system.jdbc.tables WHERE catalog='hive';

此查询将返回连接到Trino(Presto)节点的JDBC数据库中属于hive的所有表和视图的元数据。这些元数据可以用于管理和查询数据库中的对象。这个也稍微了解即可。

值得注意的是,Presto以分布式方式运行,因此涉及多个节点。如果查询涉及到远程节点上的表,请确保在远程节点上安装了相应的JDBC驱动程序。

3)metadata

Trino(以前称为Presto)提供了一个名为system.metadata的内置系统表,该表提供了与Trino中可用表和列的元数据相关的信息

system.metadata 包含以下表:analyze_propertiescatalogscolumn_propertiesmaterialized_view_propertiesmaterialized_viewsschema_propertiestable_commentstable_properties,可以用来查询Trino中可用表和列的配置信息。也稍微了解即可。

4)runtime(重点)

Trino(以前称为Presto)提供了一个名为system.runtime的内置系统表,该表提供了与Trino集群运行时状态相关的信息。

system.runtime 包含多个子表,包括nodes、tasks、queries、transactions和query_info,可用于查询集群中的正在运行的任务、查询和节点的状态。以下是这些子表的简要介绍:

  • nodes: 提供有关集群中每个节点的基本信息,如节点ID、主机名、HTTP地址和数据传输地址等。

  • optimizer_rule_stats:用于记录优化器规则的统计信息。每次Trino执行查询时,优化器会尝试应用多个规则来优化查询计划。optimizer_rule_stats 记录了每个规则被应用的次数、应用后产生的计划改进、优化器用时等信息。

  • queries: 提供有关正在运行或曾经运行的查询的信息,如查询ID、状态、发起用户、起始时间、最后活动时间、执行时间、SQL语句等。

  • tasks: 提供有关正在运行的任务及其状态的信息,如任务ID、节点ID、查询ID、任务类型等

  • transactions: 提供有关当前正在运行的事务及其状态的信息,如事务ID、状态、开始时间、最后活动时间等。

以下是一个system.runtime查询的示例:

# --catalog:数据源 --schema:数据库
${TRINO_HOME}/bin/trino-cli --server http://trino-coordinator:8080 --user=hadoop

# 查看所有数据源
show catalogs;

# 查看系统数据源库
show schemas from system;

# 查看trino节点
SELECT * FROM system.runtime.nodes;

# 下面两张表一般可用作监控,像Grafana监控
# 查询将返回当前正在运行的所有查询的信息,包括其查询ID、发起用户、起始时间和执行时间等。这些信息可用于监视和调试正在运行的查询并了解其执行情况。
SELECT * FROM system.runtime.queries WHERE state='RUNNING' limit 10;

select * from system.runtime.queries limit 10;

select * from system.runtime.tasks limit 10;

值得注意的是,由于system.runtime提供了有关集群中所有节点和任务的信息,因此查询这些表可能会对集群产生一定的负载和影响,特别是在查询大量数据时。因此,请根据需要谨慎使用这些表。

四、Trino查询Hive数据

Trino(以前称为Presto)是一个分布式的SQL查询引擎,可以查询各种不同的数据源,包括Hive。以下是一些常见的使用Trino查询Hive数据的方法。

1)查询Hive表

在Trino中,可以使用标准的SELECT语句查询Hive表。例如,以下查询将返回Hive表my_table中的所有行:

 SELECT * FROM hive.default.my_table;

Hive表的位置可以使用catalog.schema.table格式的完全限定名称指定。

2)创建Hive表

在Trino中,可以使用CREATE TABLE语句创建新的Hive表。例如,以下语句将在Hive中创建一个名为new_table的新表:

CREATE TABLE hive.default.new_table (
  col1 varchar,
  col2 int,
  col3 decimal(10,2)
)
WITH (
  format = 'ORC',
  partitioned_by = ARRAY['col3']
);

通过WITH子句指定了新表的格式和分区键。在Trino中创建的Hive表与在Hive中创建的表一样,并且可以通过Hive和Trino共享。

3)加载数据到Hive表

可以使用Trino的INSERT语句将数据加载到Hive表中。例如,以下语句将向名为my_table的Hive表中插入新行:

INSERT INTO hive.default.new_table VALUES ('value1', 123, 45.6);

可以使用SELECT语句从其他表中选择数据,并将其插入到Hive表中。

4)分区查询优化

在Hive表中,可以使用分区将数据组织成更小的块,以提高查询性能。 Trino可以通过分区查询,只查询符合条件的数据子集。以下是查询特定分区的示例:

SELECT * FROM hive.default.new_table WHERE col1 = 'value1' AND col2 = 123;

这将查询Hive表my_table中col1等于value1和col2等于123的子集。在大数据的情况下,这种分区查询能大大提高查询性能。

5)trino 操作hive数据源完整示例

1、配置数据源

$TRINO_HOME/etc/catalog/hive.properties

connector.name=hive
hive.metastore.uri=thrift://hive-metastore:9083
hive.allow-drop-table=true
hive.allow-rename-table=true
# hive.config.resources是一个可选属性,如果没有设置该属性,则Hive会使用默认的Hadoop配置文件。但是,在实际应用中,很多Hadoop集群的配置可能与默认值不同,为了确保Hive能够正确地工作,使用hive.config.resources属性指定必要的配置文件是非常必要的。
hive.config.resources=${HADOOP_HOME}/etc/hadoop/conf/core-site.xml,${HADOOP_HOME}/etc/hadoop/conf/hdfs-site.xml
2、创建Hive表

可以使用Trino的CREATE TABLE语句创建新的Hive表。以下是一个创建用于存储电影数据的Hive表的示例:

CREATE TABLE hive.default.movies (
  movie_id bigint,
  title varchar,
  rating real, -- real类似与float类型
  genres varchar,
  release_year int
)
WITH (
  format = 'ORC',
  partitioned_by = ARRAY['release_year'] -- 注意这里的分区字段必须是上面顺序的最后一个
);

该表的格式为ORC(format是Trino创建表时的一个可选属性,用于指定表的存储格式。Trino支持多种存储格式,包括Parquet、ORC、JSON、CSV等),并按照release_year列进行分区

3、加载数据到Hive表

可以使用INSERT语句将数据加载到Hive表中。以下语句将向名为movies的Hive表中插入新行:

INSERT INTO hive.default.movies
VALUES 
(1, 'Toy Story', 8.3, 'Animation|Adventure|Comedy', 1995), 
(2, 'Jumanji', 6.9, 'Action|Adventure|Family', 1995), 
(3, 'Grumpier Old Men', 6.5, 'Comedy|Romance', 1995);

INSERT INTO hive.default.movies
VALUES 
(4, 'Toy Story', 8.3, 'Animation|Adventure|Comedy', 1996), 
(5, 'Jumanji', 6.9, 'Action|Adventure|Family', 1996), 
(6, 'Grumpier Old Men', 6.5, 'Comedy|Romance', 1996);

此语句将向movies表中添加6行新数据。

4、执行Trino查询

可以使用标准的SELECT语句查询Hive表。例如,以下查询将返回Hive表movies中的所有行:

SELECT * FROM hive.default.movies;

也可以执行带有WHERE子句的查询以过滤数据。例如,以下查询将返回release_year等于1995的子集:

SELECT * FROM hive.default.movies
WHERE release_year = 1995;

可以使用JOIN操作将Hive表与其他表进行连接。例如,以下查询将连接movies表和ratings表,返回包含这两个表中匹配行的结果集:

SELECT m.title, m.release_year, r.rating
FROM hive.default.movies AS m
JOIN hive.default.ratings AS r ON m.movie_id = r.movie_id;

需要注意的是,Trino对Hive表的支持与Hive版本相关。在使用Trino之前,请确保已经使用兼容的版本配置了Hive。

五、Trino SQL 与 Hive SQL 的语法的区别

Trino与Hive SQL虽然有很多相似之处,但也存在一些语法上的差异。以下是一些常见的差异:

1)针对时间类型的函数名称

  • Trino使用标准的SQL函数名称处理日期和时间,如date_truncdate_adddate_difftime等。

  • Hive使用自己的函数名称处理日期和时间,如from_unixtimeunix_timestampdate_sub等。

2)join时ON语法的支持

Trino使用标准的SQL语法在JOIN操作中使用ON子句指定连接条件,例如:

SELECT *
FROM table1
JOIN table2 ON table1.col1 = table2.col1;

而Hive早期版本不支持ON子句,在JOIN操作中需要使用WHERE子句指定连接条件,例如:

SELECT *
FROM table1
JOIN table2 WHERE table1.col1 = table2.col1;

但从Hive 0.13版本开始,已经支持使用ON子句指定连接条件。

3)数据类型

Trino支持标准的SQL数据类型,例如VARCHAR、INTEGER等。而Hive使用自己的数据类型,例如STRINGINT等。Trino可以通过Hive Connector使用在Hive中定义的表。

需要注意的是,虽然存在一些语法上的差异,但大多数SQL功能在Trino和Hive中都是同样的。在迁移SQL查询时,需要注意这些差异并相应地更改语法以使其与Trino相容。

这里只是针对上篇文章的一些补充,有任何疑问欢迎给我留言,可关注我公众号【大数据与云原生技术分享】加群交流或私信沟通~文章来源地址https://www.toymoban.com/news/detail-679561.html

到了这里,关于【大数据】Presto(Trino)SQL 语法进阶的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【trino权威指南】使用trino详解:trino client安装、查询sql、DBeaver连接trino、java通过JDBC连接trino

    Trino CLI提供了一个基于终端的交互式shell。你可以通过它运行查询并与Trino服务端交互来 检查其元数据 。 下载地址:trino-cli-434-executable.jar     运行sql   连接trino时可以设置默认的catalog(某个连接实例)和schema(数据库),这样可以直接查询表。   USE默认的catalog和schema,直

    2024年02月04日
    浏览(82)
  • 数据库概述SQL基本语法

    database简称DB: 存储数据的仓库,是以某种结构存储数据的文件。指长期保存在计算机的存储设备上,按照一定规则组织起来,可以被用户或应用共享的数据集合。 用于创建,维护,使用数据库的一种大型软件系统。比如MySQL, Oracle, SQL server等等。 方式1:右键任务栏-任务管理

    2024年02月12日
    浏览(42)
  • GaussDB高斯数据库(SQL语法分类)

    日常查询中,最常用的是通过FROM子句实现的查询。 语法格式:使用方法: SELECT [ , ... ] FROM table_reference [ , ... ] SELECT之后和FROM子句之前出现的表达式称为SELECT项。SELECT项用于指定要查询的列,FROM指定要从哪个表中查询。如果要查询所有列,可以在SELECT后面使用*号,如

    2024年02月16日
    浏览(49)
  • GaussDB高斯数据库(SQL语法入门)

    DDL数据定于语言:用于定义或修改数据库中的对象,如:表,索引,视图,数据库,序列,用户,角色,表空间,会话等。 DDL不支持物化视图,存储过程,触发器,自定义函数,自定义类型。 DML数据操作语言:用于对数据库表中的数据进行操作,如插入,更新和删除。 DCL数

    2023年04月10日
    浏览(47)
  • 大数据:Trino简介及ETL场景的解决方案

    Presto 在 Facebook 的诞生最开始是为了填补当时 Facebook 内部实时查询和 ETL 处理之间的空白。Presto 的核心目标就是提供交互式查询,也就是我们常说的 Ad-Hoc Query,很多公司都使用它作为 OLAP 计算引擎。但是随着近年来业务场景越来越复杂,除了交互式查询场景,很多公司也需要

    2024年02月08日
    浏览(40)
  • Web数据库基本知识,SQL基本语法

    当我们谈论整个技术栈时,实际上涉及了一系列步骤,而在Web开发中,这些步骤可以被具体化为以下几个阶段: DBMS-GUI-翻译器-查询语言 在web中具体如下: postgreSQL-Hasura-Apollo+ts-GraphQL 具体解释 DBMS(数据库管理系统): 作用: 数据库管理系统允许我们直接使用SQL语言来操作数

    2024年02月03日
    浏览(49)
  • 渗透测试-SQL注入之核心语法获取数据库信息

    SQL实验室第一关 下载sqli-labs到phpstudy的www目录下 打开localhost/sqli-labs运行即可 (1)注入语句 ‘~’ 相当于16进制的0x7e 万能密码 \\\'or ‘1’ =\\\'1 ’ and ‘1’=‘1 ’ and 1=2 union select 1,user(),3- -+ 前面加’是为了闭合后面的’ (2)group_concat(string) (1)SQL手工注入方法 select schema_name

    2024年02月10日
    浏览(39)
  • Iceberg-Trino 如何解决链上数据面临的挑战

    区块链数据公司,在索引以及处理链上数据时,可能会面临一些挑战,包括: 海量数据。随着区块链上数据量的增加,数据索引将需要扩大规模以处理增加的负载并提供对数据的有效访问。因此,它导致了更高的存储成本;缓慢的指标计算和增加数据库服务器的负载。 复杂

    2024年02月02日
    浏览(45)
  • 【数据库】MySQL 高级(进阶) SQL 语句

    location表格创建 store_info表格创建 显示表格中一个或数个字段的所有数据记录 不显示重复的数据记录 按照条件进行查询 在已知的字段数据取值范围内取值 另外还有not in命令,用法一致,表示显示不在指定范围内的字段的值。 在两个字段数据值之间取值,包含两边字段的数据

    2024年02月09日
    浏览(136)
  • 数据库:Hive转Presto(二)

    继续上节代码,补充了replace_func函数,        

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包