恭喜!在前几章中,您已经了解了Trino并学会了如何安装、配置和启动它。现在您可以开始使用它了。
Trino命令行界面
Trino命令行界面(CLI)提供了一个基于终端的交互式shell,用于运行查询并与Trino服务器进行交互,以检查其元数据。
开始
就像Trino服务器本身一样,Trino CLI发布的二进制文件也在Maven中央仓库上进行分发。CLI应用程序以可执行的JAR文件形式提供,这使您可以像使用普通的Unix可执行文件一样使用它。
您可以在repo.maven.apache.org/maven2/io/t…上查看可用版本的列表。
找到与您正在运行的Trino服务器版本相同或更新的CLI版本。从版本化的目录中下载*-executable.jar文件,并将其重命名为trino;例如,使用wget和版本392:
$ wget -O trino \
https://repo.maven.apache.org/maven2/\
io/trino/trino-cli/392/trino-cli-392-executable.jar
确保该文件被设置为可执行文件。为了方便起见,将其放在PATH环境变量下可访问的位置,例如将其复制到~/bin并将该文件夹添加到PATH中:
$ chmod +x trino
$ mv trino ~/bin
$ export PATH=~/bin/:$PATH
现在您可以运行Trino CLI并确认版本:
$ trino --version
Trino CLI 392
可以通过使用help选项获取所有可用选项和命令的文档:
$ trino --help
在开始使用CLI之前,您需要确定要与哪个Trino服务器进行交互。默认情况下,CLI会连接到运行在http://localhost:8080上的Trino服务器。如果您的服务器是用于测试或开发的本地运行,或者您通过SSH访问服务器,或者您在Docker容器中使用exec并且CLI已安装在其中,那么您可以开始了:
$ trino
trino>
如果Trino运行在不同的服务器上,您需要指定URL:
$ trino --server http://trino.example.com:8080
对于使用任何身份验证系统的Trino部署,需要使用传输层安全性(TLS),因此使用HTTPS。在这种情况下,端口通常设置为使用默认的HTTPS端口443,因此您可以忽略它:
$ trino --server https://trino.example.com
trino> 提示显示您正在使用交互式控制台访问Trino服务器。输入help以获取可用命令的列表:
trino> help
Supported commands:
QUIT
EXIT
CLEAR
EXPLAIN [ ( option [, ...] ) ] <query>
options: FORMAT { TEXT | GRAPHVIZ | JSON }
TYPE { LOGICAL | DISTRIBUTED | VALIDATE | IO }
DESCRIBE <table>
SHOW COLUMNS FROM <table>
SHOW FUNCTIONS
SHOW CATALOGS [LIKE <pattern>]
SHOW SCHEMAS [FROM <catalog>] [LIKE <pattern>]
SHOW TABLES [FROM <schema>] [LIKE <pattern>]
USE [<catalog>.]<schema>
大多数命令,尤其是所有的SQL语句,在CLI中都需要以分号结尾。您可以在“SQL with Trino”中找到更多信息。现在,您可以先探索一些简单的内容以便开始。
首先,您可以检查配置为目录的数据源。至少会有一个内部的元数据目录——system。在我们的情况下,您还会找到tpch和其他一些目录:
SHOW CATALOGS;
Catalog
---------
abyss
brain
monitor
system
tpcds
tpch
(6 rows)
Query 20220618_163043_00000_9ftag, FINISHED, 1 node
Splits: 11 total, 11 done (100.00%)
0.70 [0 rows, 0B] [0 rows/s, 0B/s]
您可以轻松显示可用的模式以及模式中的表。每次查询Trino时,都会返回查询处理统计信息和结果。您将像上面的代码一样看到它们。在接下来的列表中,我们将忽略它们:
trino> SHOW SCHEMAS FROM tpch;
Schema
--------------------
information_schema
sf1
sf100
sf1000
sf10000
sf100000
sf300
sf3000
sf30000
tiny
(10 rows)
trino> SHOW TABLES FROM tpch.sf1;
Table
----------
customer
lineitem
nation
orders
part
partsupp
region
supplier
(8 rows)
现在您已经准备好查询一些实际数据了:
trino> SELECT count(name) FROM tpch.sf1.nation;
_col0
-------
25
(1 row)
或者,您可以选择一个目录和模式来进行操作,然后在查询中省略限定符:
rino> USE tpch.sf1;
USE
trino:sf1> SELECT count(name) FROM nation:
如果您知道将要使用特定的目录和模式,在启动CLI之前,您可以在启动时指定它们:
$ trino --catalog tpch --schema sf1
现在您已经准备好发挥您的SQL知识和Trino的强大功能来查询配置的数据源了。 要退出CLI,您可以简单地输入quit或exit,或者按Ctrl-D键。
分页查询(Pagination)
默认情况下,查询的结果使用less程序进行分页显示,并配置了一组精选的选项。可以通过设置环境变量TRINO_PAGER为其他程序(如more)的名称来覆盖此行为,或者将其设置为空值以完全禁用分页。
历史记录和自动补全(History and Completion)
Trino CLI会保留先前使用的命令的历史记录。您可以使用上下箭头来浏览历史记录,也可以使用Ctrl-S和Ctrl-R来搜索历史记录。如果您想重新执行一个查询,按Enter键执行查询。
默认情况下,Trino历史记录文件位于~/.trino_history。您可以使用TRINO_HISTORY_FILE环境变量更改默认值。
历史记录还用于在您输入时显示命令和查询的可能完成。使用右箭头键选择显示的命令,按Enter键运行查询。
附加诊断信息(Additional Diagnostics)
Trino CLI提供了--debug选项,用于在运行查询时启用调试信息:
$ trino --debug
trino> SELECT count(*) FROM tpch.sf1.foo;
Query 20181103_201856_00022_te3wy failed:
line 1:22: Table tpch.sf1.foo does not exist
io.trino.sql.analyzer.SemanticException:
line 1:22: Table tpch.sf1.foo does not exist
...
at java.lang.Thread.run(Thread.java:748)
执行查询
可以使用trino命令直接执行查询,并在查询完成后退出Trino CLI。如果您正在执行多个查询的脚本或者正在使用另一个系统自动化更复杂的工作流程,这通常是可取的。执行将返回Trino的查询结果。
要使用Trino CLI运行查询,请使用--execute选项。同样重要的是要完全限定表名(例如,catalog.schema.table):
$ trino --execute 'SELECT nationkey, name, regionkey FROM tpch.sf1.nation LIMIT 5'
"0","ALGERIA","0"
"1","ARGENTINA","1"
"2","BRAZIL","1"
"3","CANADA","1"
"4","EGYPT","4"
或者,使用--catalog和--schema选项:
$ trino --catalog tpch --schema sf1 \
--execute 'select nationkey, name, regionkey from nation limit 5'
您可以通过使用分号将查询分隔开来执行多个查询。 Trino CLI还支持在文件中执行命令和SQL查询,例如nations.sql文件:
USE tpch.sf1;
SELECT name FROM nation;
当您使用CLI的-f选项时,它会在命令行上返回数据,然后退出:
$ trino -f nations.sql
USE
"ALGERIA"
"ARGENTINA"
"BRAZIL"
"CANADA"
...
输出格式
Trino CLI提供了--output-format选项,用于在非交互模式下控制输出的显示方式。可用的选项包括ALIGNED、VERTICAL、TSV、TSV_HEADER、CSV、CSV_HEADER、CSV_UNQUOTED、CSV_HEADER_UNQUOTED、JSON和NULL。默认值是CSV。
忽略错误(Ignoring Errors)
如果您希望在执行文件中的查询时跳过遇到的任何错误,Trino CLI提供了--ignore-error选项。默认行为是在遇到第一个错误时停止脚本的执行。
Trino的JDBC驱动
Trino可以通过使用Trino Java数据库连接(JDBC)驱动程序从任何Java应用程序访问。JDBC是一个标准API,提供了必要的方法,如在关系数据库中查询、插入、删除和更新数据。许多在JVM上运行的客户端和服务器端应用程序实现了数据库管理、报表和其他方面的功能,并使用JDBC来访问底层数据库。所有这些应用程序都可以使用Trino的JDBC驱动程序。
Trino JDBC驱动程序允许您连接到Trino并通过SQL语句与Trino进行交互。
使用JDBC驱动程序可以使用强大的SQL客户端和数据库管理工具,例如开源工具DBeaver或SQuirreL SQL Client等。还可以使用使用JDBC的报表生成、仪表板和分析工具与Trino一起使用。
使用任何这些工具与Trino一起使用的步骤类似:
- 下载JDBC驱动程序。
- 将JDBC驱动程序放置在应用程序的类路径中。
- 配置JDBC驱动程序。
- 配置与Trino的连接。
- 连接到Trino并使用它。
以开源的数据库管理工具DBeaver为例,它使得这个过程变得简单。在安装并启动DBeaver后,按照以下步骤操作:
- 从文件菜单中选择新建。
- 从DBeaver部分选择数据库连接,然后点击下一步。
- 在输入字段中输入trino,选择Trino图标,然后点击下一步。输入prestosql,并选择PrestoSQL图标以连接到Trino集群版本350及更早版本。
- 配置与Trino的连接,然后点击完成。注意,需要提供用户名。在没有身份验证的默认Trino安装中,可以提供一个随机名称。
- 现在,在左侧的数据库导航器中可以看到连接,并可以检查模式和表,如图3-1所示。您还可以启动SQL编辑器,开始编写查询并与Trino进行交互。
SQuirreL SQL Client和许多其他工具使用类似的过程。某些步骤,例如下载JDBC驱动程序和配置数据库驱动程序和连接,可能需要更多的手动操作。让我们详细了解一下。
下载和注册驱动程序
Trino JDBC驱动程序分发在Maven中央仓库上。驱动程序以JAR文件的形式提供。 您可以在repo.maven.apache.org/maven2/io/t…上查看可用版本的列表。
确定最大的数字,该数字表示最新发布的版本,并进入该文件夹并下载.jar文件。您也可以在命令行上下载存档文件,例如使用wget命令下载版本392的文件:
$ wget https://repo.maven.apache.org/maven2/\
io/trino/trino-jdbc/392/trino-jdbc-392.jar
要在应用程序中使用Trino JDBC驱动程序,将其添加到Java应用程序的类路径中。这对于每个应用程序都有所不同,但通常使用一个名为lib的文件夹,就像SQuirreL SQL Client一样。一些应用程序包括一个对话框来添加库到类路径中,可以作为手动复制文件的替代方法。
加载驱动程序通常需要重新启动应用程序。
现在,您可以注册驱动程序。在SQuirreL SQL Client中,您可以使用界面左侧的驱动程序选项卡上的+按钮来创建新的驱动程序。
配置驱动程序时,您需要确保配置以下参数:
- 类名:io.trino.jdbc.TrinoDriver
- 示例JDBC
- URL:jdbc:trino://host:port/catalog/schema
- 名称:Trino
- 网站:trino.io
仅类名、JDBC URL和类路径上的JAR是驱动程序实际操作所需的。其他参数是可选的,取决于应用程序。
建立与Trino的连接
注册了驱动程序并启动了Trino后,您现在可以从应用程序连接到Trino。
在SQuirreL SQL Client中,这个连接配置称为别名。您可以使用用户界面左侧的Alias选项卡和+按钮创建一个新的别名,并设置以下参数:
- 名称
Trino连接的描述性名称。如果您要连接多个Trino实例、不同的模式和数据库,则名称更为重要。选择一个有意义的名称可以帮助您区分这些连接。
- 驱动程序
选择先前创建的Trino驱动程序。
- URL
JDBC URL采用以下模式:jdbc:trino://host:port/catalog/schema,其中catalog和schema是可选的。您可以使用JDBC URL jdbc:trino://localhost:8080连接到先前在本地机器上安装并在http://localhost:8080上运行的Trino。host参数是Trino协调器所在的主机。这与通过TrinoCLI进行连接时使用的主机名相同。它可以是IP地址或DNS主机名的形式。port参数是连接到Trino的HTTP端口。可选的catalog和schema参数用于通过指定的catalog和schema进行连接。当您指定这些参数时,在查询中不需要完全限定表名。
- 用户名
即使在Trino上未配置身份验证,也需要提供用户名。这允许Trino报告任何查询的发起者。
- 密码
密码与用户关联,并用于身份验证。默认安装的Trino不需要密码,因为未配置身份验证。
JDBC驱动程序可以接收更多参数作为属性。提供这些值的机制取决于应用程序。DBeaver和SQuirreL SQL Client都包括一个用户界面,可在连接配置的一部分中指定属性:
- SSL
启用连接的SSL使用,true或false。如果集群通过HTTPS可用,则必须将其设置为true。
- SSLTrustStorePath
SSL信任库的路径。
- SSLTrustStorePassword
SSL信任库的密码。
- user和password
相当于用户名和密码参数。
applicationNamePrefix 用于标识Trino应用程序的属性。这用于设置Trino查询的源名称。此名称显示在Trino Web UI中,以便管理员可以看到查询的来源。此外,它可以与资源组一起使用,在资源组中使用ApplicationName来决定如何分配Trino中的资源。这在“资源组”中进行了讨论。
有关JDBC驱动程序的可用参数的完整列表可以在Trino文档中找到;请参阅“文档”。
配置完连接后,您可以使用它连接到Trino。这使您可以查询Trino本身和所有配置的模式和数据库。查询执行、报表生成或任何其他功能的具体特性取决于连接到Trino的应用程序。图3-2显示了在SQuirreL SQL Client中成功连接到Trino并显示示例查询和结果集的情况。
Trino和ODBC
与JDBC驱动程序连接到Trino类似,Open Database Connectivity (ODBC) 允许支持ODBC的任何应用程序使用Trino。它为通常是基于C的应用程序提供了一个API。
目前,尚未提供用于Trino的开源ODBC驱动程序。但是,可以从Starburst和Simba购买商业驱动程序。
这使得许多流行的数据库管理、商业智能、报表和分析等领域的应用程序能够使用Trino,例如Microsoft Power BI、Tableau、SAS、Quest Toad等。ODBC还支持Microsoft Excel的使用。
客户端库
除了Trino CLI和JDBC驱动程序之外,Trino团队直接维护trino-python-client和trino-go-client。此外,更大的Trino社区的许多成员也创建了用于Trino的客户端库。
您可以找到用于C、Node.js、R、Ruby和其他语言的库。有一个列表在Trino网站上维护,可以在“网站”中找到。
这些库可以用于将Trino与这些语言生态系统中的应用程序集成,包括您自己的应用程序。
Trino web UI
每个Trino服务器都提供一个Web界面,通常称为Trino Web UI。Trino Web UI(如图3-3所示)公开了有关Trino服务器和服务器上的查询处理的详细信息。
Trino Web UI可以通过与Trino服务器相同的地址访问,使用相同的HTTP端口号。默认情况下,该端口为8080;例如,trino.example.com:8080。因此,在您的本地安装中,您可以在http://localhost:8080上查看Web UI。
您需要提供一个用户名和登录信息。默认情况下,未配置任何身份验证,因此您可以提供一个随机的用户名。
主要的仪表板显示了关于Trino利用率和查询列表的详细信息。更多详细信息可以在UI中找到。所有这些信息对于操作Trino和管理正在运行的查询非常有价值。
使用Web UI非常有助于监视Trino并进行性能调优,如“使用Trino Web UI进行监控”中更详细地解释。作为初学者用户,最主要的用途是确认服务器正在运行并正在处理您的查询。
Trino与SQL的结合
Trino是一个符合ANSI SQL标准的查询引擎。它允许您使用相同的SQL语句、函数和运算符查询和操作任何连接的数据源中的数据。
Trino致力于遵循现有的SQL标准。Trino的主要设计原则之一是不发明另一种类似SQL的查询语言,也不偏离SQL标准太多。只有当标准没有定义等效的功能时,才考虑扩展SQL功能集。即使在这种情况下,也会非常小心地设计该功能,考虑到标准中类似功能和其他现有SQL实现的特点,以此作为未来可能成为标准的参考。
Trino不定义与之符合的特定SQL标准版本。相反,标准被视为一份不断发展的文件,最新的标准版本始终被认为是重要的。另一方面,Trino尚未实现SQL标准中定义的所有强制性功能。按照规定,如果发现现有功能不符合标准,它将被弃用,并在后续版本中用符合标准的功能替代。
可以使用Trino CLI以及之前讨论过的任何通过JDBC或ODBC连接的数据库管理工具来查询Trino。
概念
Trino使得可以通过SQL访问外部数据源,例如关系型数据库、键值存储和对象存储。在Trino中,以下概念是理解的重要内容:
- 连接器(Connector)
将Trino适配到数据源上。每个目录(Catalog)与一个特定的连接器相关联。
- 目录(Catalog)
定义访问数据源的细节,包含模式(Schema)并配置要使用的特定连接器。
- 模式(Schema)
一种组织表的方式。目录和模式共同定义了可查询的表集合。
- 表(Table)
无序行的集合,以具有数据类型的命名列进行组织。
第一个示例
本节提供了对支持的 SQL 和 Trino 语句的简要概述,更详细的内容可以在第 8 和第 9 章中找到。 Trino 元数据包含在系统目录中。可以使用特定的语句来查询这些数据,并且通常可以了解可用的目录、模式、信息模式、表、函数等更多信息。 使用以下语句列出所有目录:
SHOW CATALOGS;
Catalog
---------
abyss
brain
monitor
system
tpcds
tpch
(6 rows)
显示 tpch 目录中的所有模式,如下所示:
SHOW SCHEMAS FROM tpch;
Schema
------------------
information_schema
sf1
sf100
sf1000
sf10000
sf100000
sf300
sf3000
sf30000
tiny
(10 rows)
以下是如何列出 sf1 模式中的表:
SHOW TABLES FROM tpch.sf1;
Table
---------
customer
lineitem
nation
orders
part
partsupp
region
supplier
(8 rows)
通过以下方式了解 region 表中的数据情况:
DESCRIBE tpch.sf1.region;
Column | Type | Extra | Comment
-----------+--------------+-------+---------
regionkey | bigint | |
name | varchar(25) | |
comment | varchar(152) | |
(3 rows)
还有其他有用的语句,例如USE和SHOW FUNCTIONS。有关系统目录和Trino语句的更多信息,请参阅“Trino语句”。 通过了解可用的目录、模式和表,您可以使用标准SQL来查询数据。 您可以检查可用的地区:
SELECT name FROM tpch.sf1.region;
name
------------
AFRICA
AMERICA
ASIA
EUROPE
MIDDLE EAST
(5 rows)
您可以返回子集并对列表进行排序:
SELECT name FROM tpch.sf1.region
WHERE name like 'A%' ORDER BY name DESC;
name
---------
ASIA
AMERICA
AFRICA
(3 rows)
支持连接多个表和其他SQL标准的部分:
SELECT nation.name AS nation, region.name AS region
FROM tpch.sf1.region, tpch.sf1.nation
WHERE region.regionkey = nation.regionkey
AND region.name LIKE 'AFRICA'
ORDER by nation;
nation | region
------------+--------
ALGERIA | AFRICA
ETHIOPIA | AFRICA
KENYA | AFRICA
MOROCCO | AFRICA
MOZAMBIQUE | AFRICA
(5 rows)
Trino支持使用||进行字符串连接的操作符。您还可以使用加号(+)和减号(-)等数学运算符。 您可以修改上述查询,使用JOIN操作符并将结果字符串连接到一个字段中:
SELECT nation.name || ' / ' || region.name AS Location
FROM tpch.sf1.region JOIN tpch.sf1.nation
ON region.regionkey = nation.regionkey
AND region.name LIKE 'AFRICA'
ORDER BY Location;
Location
-------------------
ALGERIA / AFRICA
ETHIOPIA / AFRICA
KENYA / AFRICA
MOROCCO / AFRICA
MOZAMBIQUE / AFRICA
(5 rows)
除了运算符外,Trino还支持各种各样的函数。它们涵盖了从简单用例到非常复杂的功能。您可以使用SHOW FUNCTIONS在Trino中显示函数列表。 一个简单的例子是计算所有订单的平均价格并显示舍入后的整数值:
SELECT cast(round(avg(totalprice)) AS integer) AS average_price
FROM tpch.sf1.orders;
average_price
--------------
151220
(1 row)
有关SQL用法的更多详细信息可在Trino文档和第8章中找到。关于函数和运算符的信息也可以在网站上找到,并且您可以在第9章中找到更多示例的概述。