Apache Presto 快速指南



Apache Presto - 概述

数据分析是分析原始数据以收集相关信息以进行更好决策的过程。它主要用于许多组织中做出商业决策。好吧,大数据分析涉及大量数据,并且此过程非常复杂,因此公司使用不同的策略。

例如,Facebook 是世界上领先的数据驱动型和最大的数据仓库公司之一。Facebook 仓库数据存储在 Hadoop 中以进行大规模计算。后来,当仓库数据增长到 PB 级时,他们决定开发一个新的低延迟系统。在 2012 年,Facebook 团队成员设计了“Presto” 用于交互式查询分析,即使在 PB 级数据的情况下也能快速运行。

什么是 Apache Presto?

Apache Presto 是一个分布式并行查询执行引擎,针对低延迟和交互式查询分析进行了优化。Presto 可以轻松运行查询并在不宕机的情况下扩展,即使是从 GB 到 PB。

单个 Presto 查询可以处理来自多个数据源的数据,例如 HDFS、MySQL、Cassandra、Hive 和许多其他数据源。Presto 使用 Java 构建,并且易于与其他数据基础设施组件集成。Presto 功能强大,并且 Airbnb、DropBox、Groupon、Netflix 等领先公司正在采用它。

Presto - 特性

Presto 包含以下特性 -

  • 简单且可扩展的架构。
  • 可插拔连接器 - Presto 支持可插拔连接器为查询提供元数据和数据。
  • 流水线执行 - 避免不必要的 I/O 延迟开销。
  • 用户定义函数 - 分析师可以创建自定义用户定义函数以轻松迁移。
  • 矢量化列式处理。

Presto - 优势

以下是 Apache Presto 提供的优势列表 -

  • 专门的 SQL 操作
  • 易于安装和调试
  • 简单的存储抽象
  • 快速扩展 PB 级数据,同时保持低延迟

Presto - 应用

Presto 支持当今大多数优秀的工业应用。让我们看看一些值得注意的应用。

  • Facebook - Facebook 为数据分析需求构建了 Presto。Presto 可以轻松扩展大量数据。

  • Teradata - Teradata 提供大数据分析和数据仓库的端到端解决方案。Teradata 对 Presto 的贡献使更多公司更容易满足所有分析需求。

  • Airbnb - Presto 是 Airbnb 数据基础设施不可或缺的一部分。好吧,数百名员工每天都在使用这项技术运行查询。

为什么选择 Presto?

Presto 支持标准 ANSI SQL,这使得数据分析师和开发人员非常容易使用。尽管它使用 Java 构建,但它避免了与内存分配和垃圾回收相关的典型 Java 代码问题。Presto 具有对 Hadoop 友好的连接器架构。它允许轻松插入文件系统。

Presto 可以在多个 Hadoop 发行版上运行。此外,Presto 可以从 Hadoop 平台查询 Cassandra、关系数据库或其他数据存储。这种跨平台分析能力使 Presto 用户能够从 GB 到 PB 的数据中提取最大业务价值。

Apache Presto - 架构

Presto 的架构与经典 MPP(大规模并行处理)DBMS 架构几乎相同。下图说明了 Presto 的架构。

Presto Architecture

上图包含不同的组件。下表详细描述了每个组件。

序号 组件和描述
1.

客户端

客户端(Presto CLI)将 SQL 语句提交给协调器以获取结果。

2.

协调器

协调器是一个主守护进程。协调器首先解析 SQL 查询,然后分析并计划查询执行。调度程序执行管道执行,将工作分配给最近的节点并监视进度。

3.

连接器

存储插件称为连接器。Hive、HBase、MySQL、Cassandra 等充当连接器;否则,您还可以实现自定义连接器。连接器为查询提供元数据和数据。协调器使用连接器获取元数据以构建查询计划。

4.

工作节点

协调器将任务分配给工作节点。工作节点从连接器获取实际数据。最后,工作节点将结果传递给客户端。

Presto - 工作流程

Presto 是一个在节点集群上运行的分布式系统。Presto 的分布式查询引擎针对交互式分析进行了优化,并支持标准 ANSI SQL,包括复杂查询、聚合、联接和窗口函数。Presto 架构简单且可扩展。Presto 客户端 (CLI) 将 SQL 语句提交给主守护进程协调器。

调度程序通过执行管道连接。调度程序将工作分配给最靠近数据且监视进度的节点。协调器将任务分配给多个工作节点,最后工作节点将结果传递回客户端。客户端从输出进程中提取数据。可扩展性是关键设计。可插拔连接器(如 Hive、HBase、MySQL 等)为查询提供元数据和数据。Presto 的设计采用了“简单存储抽象”,这使得针对这些不同类型的数据源轻松提供 SQL 查询功能。

执行模型

Presto 支持自定义查询和执行引擎,并使用旨在支持 SQL 语义的操作符。除了改进的调度之外,所有处理都在内存中进行,并在不同阶段的网络之间进行流水线处理。这避免了不必要的 I/O 延迟开销。

Apache Presto - 安装

本章将说明如何在您的机器上安装 Presto。让我们了解 Presto 的基本要求,

  • Linux 或 Mac OS
  • Java 版本 8

现在,让我们继续执行以下步骤以在您的机器上安装 Presto。

验证 Java 安装

希望您现在已经在您的机器上安装了 Java 版本 8,因此您只需使用以下命令验证它。

$ java -version 

如果 Java 已成功安装在您的机器上,您将看到已安装 Java 的版本。如果 Java 未安装,请按照后续步骤在您的机器上安装 Java 8。

下载 JDK。通过访问以下链接下载最新版本的 JDK。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

最新版本是 JDK 8u 92,文件为“jdk-8u92-linux-x64.tar.gz”。请将文件下载到您的机器上。

之后,解压缩文件并移动到特定目录。

然后设置 Java 备选方案。最后,Java 将安装在您的机器上。

Apache Presto 安装

通过访问以下链接下载最新版本的 Presto,

https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.149/

现在,“presto-server-0.149.tar.gz”的最新版本将下载到您的机器上。

解压 tar 文件

使用以下命令解压缩tar文件 -

$ tar  -zxf  presto-server-0.149.tar.gz 
$ cd presto-server-0.149 

配置设置

创建“data”目录

在安装目录之外创建一个 data 目录,该目录将用于存储日志、元数据等,以便在升级 Presto 时轻松保留它。它使用以下代码定义 -

$ cd  
$ mkdir data

要查看其所在路径,请使用命令“pwd”。此位置将在下一个 node.properties 文件中分配。

创建“etc”目录

使用以下代码在 Presto 安装目录中创建一个 etc 目录 -

$ cd presto-server-0.149 
$ mkdir etc

此目录将保存配置文件。让我们逐个创建每个文件。

节点属性

Presto 节点属性文件包含每个节点特有的环境配置。它在 etc 目录(etc/node.properties)中使用以下代码创建 -

$ cd etc 
$ vi node.properties  

node.environment = production 
node.id = ffffffff-ffff-ffff-ffff-ffffffffffff 
node.data-dir = /Users/../workspace/Presto

完成所有更改后,保存文件并退出终端。这里node.data是上面创建的 data 目录的位置路径。node.id表示每个节点的唯一标识符。

JVM 配置

在 etc 目录(etc/jvm.config)中创建一个文件“jvm.config”。此文件包含用于启动 Java 虚拟机的一系列命令行选项。

$ cd etc 
$ vi jvm.config  

-server 
-Xmx16G 
-XX:+UseG1GC 
-XX:G1HeapRegionSize = 32M 
-XX:+UseGCOverheadLimit 
-XX:+ExplicitGCInvokesConcurrent 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:OnOutOfMemoryError = kill -9 %p 

完成所有更改后,保存文件并退出终端。

配置属性

在 etc 目录(etc/config.properties)中创建一个文件“config.properties”。此文件包含 Presto 服务器的配置。如果您正在设置一台机器进行测试,则 Presto 服务器只能充当协调进程,如以下代码中定义的那样 -

$ cd etc 
$ vi config.properties  

coordinator = true 
node-scheduler.include-coordinator = true 
http-server.http.port = 8080 
query.max-memory = 5GB 
query.max-memory-per-node = 1GB 
discovery-server.enabled = true 
discovery.uri = https://127.0.0.1:8080

这里,

  • coordinator - 主节点。

  • node-scheduler.include-coordinator - 允许在协调器上调度工作。

  • http-server.http.port - 指定 HTTP 服务器的端口。

  • query.max-memory=5GB - 分布式内存的最大量。

  • query.max-memory-per-node=1GB - 每个节点的最大内存量。

  • discovery-server.enabled - Presto 使用 Discovery 服务查找集群中的所有节点。

  • discovery.uri - Discovery 服务器的 URI。

如果您正在设置多台机器 Presto 服务器,Presto 将充当协调和工作进程。使用此配置设置在多台机器上测试 Presto 服务器。

协调器配置

$ cd etc 
$ vi config.properties  

coordinator = true 
node-scheduler.include-coordinator = false 
http-server.http.port = 8080 
query.max-memory = 50GB 
query.max-memory-per-node = 1GB 
discovery-server.enabled = true 
discovery.uri = https://127.0.0.1:8080 

工作节点配置

$ cd etc 
$ vi config.properties  

coordinator = false 
http-server.http.port = 8080 
query.max-memory = 50GB 
query.max-memory-per-node = 1GB 
discovery.uri = https://127.0.0.1:8080

日志属性

在 etc 目录(etc/log.properties)中创建一个文件“log.properties”。此文件包含命名日志记录器层次结构的最小日志级别。它使用以下代码定义 -

$ cd etc 
$ vi log.properties  
com.facebook.presto = INFO

保存文件并退出终端。这里,使用了四个日志级别,如 DEBUG、INFO、WARN 和 ERROR。默认日志级别为 INFO。

目录属性

在 etc 目录(etc/catalog)中创建一个目录“catalog”。这将用于挂载数据。例如,使用以下内容创建etc/catalog/jmx.properties以将jmx 连接器作为 jmx 目录挂载 -

$ cd etc 
$ mkdir catalog 
$ cd catalog 
$ vi jmx.properties  
connector.name = jmx 

启动 Presto

可以使用以下命令启动 Presto,

$ bin/launcher start 

然后您将看到类似于此的响应,

Started as 840

运行 Presto

要启动 Presto 服务器,请使用以下命令 -

$ bin/launcher run

成功启动 Presto 服务器后,您可以在“var/log”目录中找到日志文件。

  • launcher.log - 此日志由启动器创建,并连接到服务器的 stdout 和 stderr 流。

  • server.log - 这是 Presto 使用的主日志文件。

  • http-request.log - 服务器接收到的 HTTP 请求。

到目前为止,您已成功在您的机器上安装了 Presto 配置设置。让我们继续执行以下步骤以安装 Presto CLI。

安装 Presto CLI

Presto CLI 提供了一个基于终端的交互式 shell 用于运行查询。

通过访问以下链接下载 Presto CLI,

https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.149/

现在“presto-cli-0.149-executable.jar”将安装在您的机器上。

运行 CLI

下载 presto-cli 后,将其复制到您想要运行它的位置。此位置可以是任何能够访问协调器的节点。首先将 Jar 文件重命名为 Presto。然后使用以下代码使用chmod + x命令使其可执行。

$ mv presto-cli-0.149-executable.jar presto  
$ chmod +x presto

现在使用以下命令执行 CLI,

./presto --server localhost:8080 --catalog jmx --schema default  
Here jmx(Java Management Extension) refers to catalog and default referes to schema. 

您将看到以下响应,

 presto:default>

现在在您的终端上键入“jps”命令,您将看到正在运行的守护进程。

停止 Presto

执行完所有操作后,您可以使用以下命令停止 presto 服务器:

$ bin/launcher stop 

Apache Presto - 配置设置

本章将讨论 Presto 的配置设置。

Presto 验证器

Presto 验证器可用于针对另一个数据库(例如 MySQL)测试 Presto,或将两个 Presto 集群相互测试。

在 MySQL 中创建数据库

打开 MySQL 服务器并使用以下命令创建数据库。

create database test 

现在您已在服务器中创建了“test”数据库。使用以下查询创建表并加载数据。

CREATE TABLE verifier_queries( 
   id INT NOT NULL AUTO_INCREMENT, 
   suite VARCHAR(256) NOT NULL, 
   name VARCHAR(256), 
   test_catalog VARCHAR(256) NOT NULL, 
   test_schema VARCHAR(256) NOT NULL, 
   test_prequeries TEXT, 
   test_query TEXT NOT NULL, 
   test_postqueries TEXT, 
   test_username VARCHAR(256) NOT NULL default 'verifier-test', 
   test_password VARCHAR(256), 
   control_catalog VARCHAR(256) NOT NULL, 
   control_schema VARCHAR(256) NOT NULL, 
   control_prequeries TEXT, 
   control_query TEXT NOT NULL, 
   control_postqueries TEXT, 
   control_username VARCHAR(256) NOT NULL default 'verifier-test', 
   control_password VARCHAR(256), 
   session_properties_json TEXT,            
   PRIMARY KEY (id) 
);

添加配置设置

创建一个属性文件来配置验证器:

$ vi config.properties  

suite = mysuite 
query-database = jdbc:mysql://127.0.0.1:3306/tutorials?user=root&password=pwd 
control.gateway = jdbc:presto://127.0.0.1:8080 
test.gateway = jdbc:presto://127.0.0.1:8080 
thread-count = 1 

这里,在query-database字段中,输入以下详细信息:mysql 数据库名称、用户名和密码。

下载 JAR 文件

访问以下链接下载 Presto-verifier jar 文件:

https://repo1.maven.org/maven2/com/facebook/presto/presto-verifier/0.149/

现在版本“presto-verifier-0.149-executable.jar”已下载到您的机器上。

执行 JAR

使用以下命令执行 JAR 文件:

$ mv presto-verifier-0.149-executable.jar verifier  
$ chmod+x verifier 

运行验证器

使用以下命令运行验证器:

$ ./verifier config.properties 

创建表

让我们使用以下查询在“test”数据库中创建一个简单的表。

create table product(id int not null, name varchar(50))

插入表

创建表后,使用以下查询插入两条记录:

insert into product values(1,’Phone') 
insert into product values(2,’Television’)

运行验证器查询

在验证器终端 (./verifier config.propeties) 中执行以下示例查询以检查验证器结果。

示例查询

insert into verifier_queries (suite, test_catalog, test_schema, test_query, 
control_catalog, control_schema, control_query) values 
('mysuite', 'mysql', 'default', 'select * from mysql.test.product', 
'mysql', 'default', 'select * from mysql.test.product');

这里,select * from mysql.test.product查询指的是 mysql 目录,test是数据库名称,product是表名称。通过这种方式,您可以使用 Presto 服务器访问 mysql 连接器。

这里,两个相同的 select 查询相互测试以查看性能。类似地,您可以运行其他查询以测试性能结果。您还可以连接两个 Presto 集群以检查性能结果。

Apache Presto - 管理工具

在本章中,我们将讨论 Presto 中使用的管理工具。让我们从 Presto 的 Web 界面开始。

Web 界面

Presto 提供了一个用于监控和管理查询的 Web 界面。可以通过协调器配置属性中指定的端口号访问它。

启动 Presto 服务器和 Presto CLI。然后您可以从以下 URL 访问 Web 界面:https://127.0.0.1:8080/

Web Interface

输出将类似于以上屏幕。

这里,主页列出了查询,以及唯一查询 ID、查询文本、查询状态、完成百分比、用户名和此查询的来源等信息。最新的查询首先运行,然后已完成或未完成的查询显示在底部。

调整 Presto 的性能

如果 Presto 集群存在任何与性能相关的问题,请将您的默认配置设置更改为以下设置。

配置属性

  • task. info -refresh-max-wait - 减少协调器的工作负载。

  • task.max-worker-threads - 将进程拆分并分配给每个工作节点。

  • distributed-joins-enabled - 基于哈希的分布式连接。

  • node-scheduler.network-topology - 将网络拓扑设置为调度程序。

JVM 设置

将您的默认 JVM 设置更改为以下设置。这将有助于诊断垃圾回收问题。

-XX:+PrintGCApplicationConcurrentTime 
-XX:+PrintGCApplicationStoppedTime 
-XX:+PrintGCCause 
-XX:+PrintGCDateStamps 
-XX:+PrintGCTimeStamps 
-XX:+PrintGCDetails 
-XX:+PrintReferenceGC 
-XX:+PrintClassHistogramAfterFullGC 
-XX:+PrintClassHistogramBeforeFullGC 
-XX:PrintFLSStatistics = 2 
-XX:+PrintAdaptiveSizePolicy 
-XX:+PrintSafepointStatistics 
-XX:PrintSafepointStatisticsCount = 1 

Apache Presto - 基本 SQL 操作

在本章中,我们将讨论如何在 Presto 上创建和执行查询。让我们了解 Presto 支持的基本数据类型。

基本数据类型

下表描述了 Presto 的基本数据类型。

序号 数据类型 & 描述
1.

VARCHAR

可变长度字符数据

2.

BIGINT

64 位有符号整数

3.

DOUBLE

64 位浮点双精度值

4.

DECIMAL

固定精度的十进制数。例如 DECIMAL(10,3) - 10 是精度,即总位数,3 是表示为小数点的比例值。比例是可选的,默认值为 0

5.

BOOLEAN

布尔值 true 和 false

6.

VARBINARY

可变长度二进制数据

7.

JSON

JSON 数据

8.

DATE

日期数据类型,表示为年-月-日

9.

TIME, TIMESTAMP, TIMESTAMP with TIME ZONE

TIME - 一天中的时间(时-分-秒-毫秒)

TIMESTAMP - 日期和一天中的时间

TIMESTAMP with TIME ZONE - 日期和一天中的时间,以及来自值的时间区域

10.

INTERVAL

拉伸或扩展日期和时间数据类型

11.

ARRAY

给定组件类型的数组。例如,ARRAY[5,7]

12.

MAP

给定组件类型之间的映射。例如,MAP(ARRAY[‘one’,’two’],ARRAY[5,7])

13.

ROW

由命名字段组成的行结构

Presto − 运算符

Presto 运算符列在下表中。

序号 运算符 & 描述
1. 算术运算符

Presto 支持算术运算符,如 +、-、*、/、%

2. 关系运算符

<,>,<=,>=,=,<>

3. 逻辑运算符

AND、OR、NOT

4. 范围运算符

范围运算符用于测试特定范围内的值。Presto 支持 BETWEEN、IS NULL、IS NOT NULL、GREATEST 和 LEAST

5. 十进制运算符

二元算术十进制运算符对十进制类型执行二元算术运算 一元十进制运算符 - - 运算符执行否定

6. 字符串运算符

‘||’ 运算符执行字符串连接

7. 日期和时间运算符

对日期和时间数据类型执行算术加法和减法运算

8. 数组运算符

下标运算符 [] - 访问数组的元素

连接运算符 || - 将数组与数组或相同类型的元素连接起来

9. 映射运算符

映射下标运算符 [] - 从映射中检索与给定键对应的值

Apache Presto - SQL 函数

到目前为止,我们一直在讨论在 Presto 上运行一些简单的基本查询。本章将讨论重要的 SQL 函数。

数学函数

数学函数对数学公式进行运算。下表详细描述了函数列表。

序号 函数 & 描述
1. abs(x)

返回x的绝对值

2. cbrt(x)

返回x的立方根

3. ceiling(x)

返回x值向上舍入到最接近的整数

4.

ceil(x)

ceiling(x)的别名

5. degrees(x)

返回x的度数值

6. e(x)

返回欧拉数的双精度值

7.

exp(x)

返回欧拉数的指数值

8. floor(x)

返回x向下舍入到最接近的整数

9.

from_base(string,radix)

返回解释为基数为 radix 的数字的字符串的值

10.

ln(x)

返回x的自然对数

11. log2(x)

返回x的以 2 为底的对数

12.

log10(x)

返回x的以 10 为底的对数

13.

log(x,y)

返回x的以y为底的对数

14. mod(n,m)

返回n除以m的模数(余数)

15.

pi()

返回 pi 值。结果将作为双精度值返回

16. power(x,p)

返回值‘p’x值的幂

17.

pow(x,p)

power(x,p)的别名

18. radians(x)

将角度x从度数转换为弧度

19.

rand()

radians()的别名

20. random()

返回伪随机值

21.

rand(n)

random()的别名

22. round(x)

返回 x 的舍入值

23.

round(x,d)

x值舍入到‘d’位小数

24.

sign(x)

返回 x 的符号函数,即:

如果参数为 0,则返回 0

如果参数大于 0,则返回 1

如果参数小于 0,则返回 -1

对于双精度参数,该函数还返回:

如果参数为 NaN,则返回 NaN

如果参数为 +Infinity,则返回 1

如果参数为 -Infinity,则返回 -1

25. sqrt(x)

返回x的平方根

26. to_base(x,radix)

返回类型为 archer。结果将作为x的基数 radix 返回

27. truncate(x)

截断x的值

28. width_bucket(x, bound1, bound2, n)

返回指定 bound1 和 bound2 边界以及 n 个存储桶的x的存储桶编号

29. width_bucket(x, bins)

根据数组 bins 指定的存储桶返回x的存储桶编号

三角函数

三角函数参数表示为弧度。下表列出了这些函数。

序号 函数 & 描述
1. acos(x)

返回反余弦值(x)

2.

asin(x)

返回反正弦值(x)

3.

atan(x)

返回反正切值(x)

4. atan2(y,x)

返回反正切值(y/x)

5.

cos(x)

返回余弦值(x)

6. cosh(x)

返回双曲余弦值(x)

7. sin(x)

返回正弦值(x)

8.

tan(x)

返回正切值(x)

9.

tanh(x)

返回双曲正切值(x)

按位函数

下表列出了按位函数。

序号 函数 & 描述
1. bit_count(x, bits)

计算位数

2. bitwise_and(x,y)

对两个位xy执行按位 AND 运算

3. bitwise_or(x,y)

两个比特x, y之间的按位或运算

4. bitwise_not(x)

比特x的按位非运算

5. bitwise_xor(x,y)

比特x, y的异或运算

字符串函数

下表列出了字符串函数。

序号 函数 & 描述
1. concat(string1, ..., stringN)

连接给定的字符串

2. length(string)

返回给定字符串的长度

3. lower(string)

返回字符串的小写格式

4. upper(string)

返回给定字符串的大写格式

5. lpad(string, size, padstring)

给定字符串的左填充

6. ltrim(string)

删除字符串开头的空格

7. replace(string, search, replace)

替换字符串值

8. reverse(string)

反转对字符串执行的操作

9. rpad(string, size, padstring)

给定字符串的右填充

10. rtrim(string)

删除字符串末尾的空格

11. split(string, delimiter)

根据分隔符拆分字符串,并返回大小最多为limit的数组

12. split_part(string, delimiter, index)

根据分隔符拆分字符串并返回字段索引

13. strpos(string, substring)

返回子字符串在字符串中的起始位置

14. substr(string, start)

返回给定字符串的子字符串

15. substr(string, start, length)

返回给定字符串的指定长度的子字符串

16. trim(string)

删除字符串开头和结尾的空格

日期和时间函数

下表列出了日期和时间函数。

序号 函数 & 描述
1. current_date

返回当前日期

2. current_time

返回当前时间

3. current_timestamp

返回当前时间戳

4. current_timezone()

返回当前时区

5. now()

返回当前日期、时间戳以及时区

6. localtime

返回本地时间

7. localtimestamp

返回本地时间戳

正则表达式函数

下表列出了正则表达式函数。

序号 函数 & 描述
1. regexp_extract_all(string, pattern)

返回模式的正则表达式匹配的字符串

2. regexp_extract_all(string, pattern, group)

返回模式和组的正则表达式匹配的字符串

3. regexp_extract(string, pattern)

返回模式的正则表达式匹配的第一个子字符串

4. regexp_extract(string, pattern, group)

返回模式和组的正则表达式匹配的第一个子字符串

5. regexp_like(string, pattern)

返回与模式匹配的字符串。如果返回字符串,则值为true,否则为false

6. regexp_replace(string, pattern)

用模式替换表达式匹配的字符串的实例

7. regexp_replace(string, pattern, replacement)

用模式和替换替换表达式匹配的字符串的实例

8. regexp_split(string, pattern)

根据给定模式拆分正则表达式

JSON 函数

下表列出了 JSON 函数。

序号 函数 & 描述
1. json_array_contains(json, value)

检查值是否存在于 JSON 数组中。如果值存在,则返回 true,否则返回 false

2. json_array_get(json_array, index)

获取 JSON 数组中索引对应的元素

3. json_array_length(json)

返回 JSON 数组的长度

4. json_format(json)

返回 JSON 结构格式

5. json_parse(string)

将字符串解析为 JSON

6. json_size(json, json_path)

返回值的尺寸

URL 函数

下表列出了 URL 函数。

序号 函数 & 描述
1. url_extract_host(url)

返回 URL 的主机

2. url_extract_path(url)

返回 URL 的路径

3. url_extract_port(url)

返回 URL 的端口

4. url_extract_protocol(url)

返回 URL 的协议

5. url_extract_query(url)

返回 URL 的查询字符串

聚合函数

下表列出了聚合函数。

序号 函数 & 描述
1.

avg(x)

返回给定值的平均值

2. min(x,n)

返回两个值中的最小值

3. max(x,n)

返回两个值中的最大值

4. sum(x)

返回值的总和

5. count(*)

返回输入行的数量

6. count(x)

返回输入值的计数

7. checksum(x)

返回x的校验和

8. arbitrary(x)

返回x的任意值

颜色函数

下表列出了颜色函数。

序号 函数 & 描述
1. bar(x, width)

使用 rgb low_color 和 high_color 渲染单个条形

2. bar(x, width, low_color, high_color)

渲染指定宽度的单个条形

3. color(string)

返回输入字符串的颜色值

4. render(x, color)

使用特定的颜色(使用 ANSI 颜色代码)渲染值 x

5. render(b)

接受布尔值 b,并使用 ANSI 颜色代码渲染绿色 true 或红色 false

6.

rgb(red, green, blue)

返回一个颜色值,捕获作为 int 参数提供的三个分量颜色值的 RGB 值,范围从 0 到 255

数组函数

下表列出了数组函数。

序号 函数 & 描述
1. array_max(x)

查找数组中的最大元素

2. array_min(x)

查找数组中的最小元素

3. array_sort(x)

对数组中的元素进行排序

4. array_remove(x,element)

从数组中删除特定元素

5. concat(x,y)

连接两个数组

6. contains(x,element)

查找数组中是否存在给定元素。如果存在,则返回 True,否则返回 False

7. array_position(x,element)

查找给定元素在数组中的位置

8. array_intersect(x,y)

执行两个数组之间的交集运算

9. element_at(array,index)

返回数组元素的位置

10. slice(x,start,length)

使用指定的长度切片数组元素

Teradata 函数

下表列出了 Teradata 函数。

序号 函数 & 描述
1. index(string,substring)

返回包含给定子字符串的字符串的索引

2. substring(string,start)

返回给定字符串的子字符串。您可以在此处指定起始索引

3. substring(string,start,length)

返回给定字符串的子字符串,用于指定的起始索引和字符串的长度

Apache Presto - MySQL 连接器

MySQL 连接器用于查询外部 MySQL 数据库。

先决条件

MySQL 服务器安装。

配置设置

希望您已在您的机器上安装了 MySQL 服务器。要在 Presto 服务器上启用 MySQL 属性,您必须在“etc/catalog”目录中创建一个名为“mysql.properties”的文件。执行以下命令以创建 mysql.properties 文件。

$ cd etc 
$ cd catalog 
$ vi mysql.properties   

connector.name = mysql 
connection-url = jdbc:mysql://127.0.0.1:3306 
connection-user = root 
connection-password = pwd 

保存文件并退出终端。在上述文件中,您必须在 connection-password 字段中输入您的 MySQL 密码。

在 MySQL 服务器中创建数据库

打开 MySQL 服务器并使用以下命令创建数据库。

create database tutorials

现在您已在服务器中创建了“tutorials”数据库。要启用数据库类型,请在查询窗口中使用命令“use tutorials”。

创建表

让我们在“tutorials”数据库上创建一个简单的表。

create table author(auth_id int not null, auth_name varchar(50),topic varchar(100))

插入表

创建表后,使用以下查询插入三条记录。

insert into author values(1,'Doug Cutting','Hadoop') 
insert into author values(2,’James Gosling','java') 
insert into author values(3,'Dennis Ritchie’,'C')

选择记录

要检索所有记录,请键入以下查询。

查询

select * from author

结果

auth_id    auth_name      topic  
1        Doug Cutting     Hadoop 
2        James Gosling    java 
3        Dennis Ritchie     C 

截至目前,您已使用 MySQL 服务器查询了数据。让我们将 Mysql 存储插件连接到 Presto 服务器。

连接 Presto CLI

键入以下命令以在 Presto CLI 上连接 MySql 插件。

./presto --server localhost:8080 --catalog mysql --schema tutorials 

您将收到以下响应。

presto:tutorials> 

这里“tutorials”指的是 mysql 服务器中的模式。

列出模式

要列出 mysql 中的所有模式,请在 Presto 服务器中键入以下查询。

查询

presto:tutorials> show schemas from mysql;

结果

      Schema 
-------------------- 
 information_schema 
 performance_schema 
 sys 
 tutorials

从这个结果中,我们可以得出结论,前三个模式是预定义的,最后一个模式是您自己创建的。

列出模式中的表

以下查询列出了 tutorials 模式中的所有表。

查询

presto:tutorials> show tables from mysql.tutorials; 

结果

  Table 
-------- 
 author

我们只在这个模式中创建了一个表。如果您创建了多个表,它将列出所有表。

描述表

要描述表字段,请键入以下查询。

查询

presto:tutorials> describe mysql.tutorials.author;

结果

  Column   |     Type     | Comment 
-----------+--------------+--------- 
 auth_id   | integer      | 
 auth_name | varchar(50)  | 
 topic     | varchar(100) |

显示表中的列

查询

presto:tutorials> show columns from mysql.tutorials.author; 

结果

 Column    |     Type     | Comment 
-----------+--------------+--------- 
 auth_id   | integer      | 
 auth_name | varchar(50)  | 
 topic     | varchar(100) |

访问表记录

要从 mysql 表中获取所有记录,请执行以下查询。

查询

presto:tutorials> select * from mysql.tutorials.author; 

结果

auth_id  |   auth_name    | topic 
---------+----------------+-------- 
       1 | Doug Cutting   | Hadoop 
       2 | James Gosling  | java 
       3 | Dennis Ritchie | C

从这个结果中,您可以在 Presto 中检索 mysql 服务器记录。

使用 as 命令创建表

Mysql 连接器不支持 create table 查询,但您可以使用 as 命令创建表。

查询

presto:tutorials> create table mysql.tutorials.sample as 
select * from mysql.tutorials.author; 

结果

CREATE TABLE: 3 rows

您不能直接插入行,因为此连接器有一些限制。它不支持以下查询:

  • create
  • insert
  • update
  • delete
  • drop

要查看新创建表中的记录,请键入以下查询。

查询

presto:tutorials> select * from mysql.tutorials.sample; 

结果

auth_id  |   auth_name    | topic 
---------+----------------+-------- 
       1 | Doug Cutting   | Hadoop 
       2 | James Gosling  | java 
       3 | Dennis Ritchie | C

Apache Presto - JMX 连接器

Java 管理扩展 (JMX) 提供有关 Java 虚拟机和 JVM 内部运行的软件的信息。JMX 连接器用于在 Presto 服务器中查询 JMX 信息。

由于我们已经在“etc/catalog”目录下启用了“jmx.properties”文件。现在连接 Prest CLI 以启用 JMX 插件。

Presto CLI

查询

$ ./presto --server localhost:8080 --catalog jmx --schema jmx 

结果

您将收到以下响应。

presto:jmx> 

JMX 模式

要列出“jmx”中的所有模式,请键入以下查询。

查询

presto:jmx> show schemas from jmx; 

结果

      Schema 
-------------------- 
 information_schema  
 current

显示表

要查看“current”模式中的表,请使用以下命令。

查询 1

presto:jmx> show tables from jmx.current; 

结果

                                    Table                   
------------------------------------------------------------------------------
 com.facebook.presto.execution.scheduler:name = nodescheduler
 com.facebook.presto.execution:name = queryexecution
 com.facebook.presto.execution:name = querymanager
 com.facebook.presto.execution:name = remotetaskfactory
 com.facebook.presto.execution:name = taskexecutor
 com.facebook.presto.execution:name = taskmanager
 com.facebook.presto.execution:type = queryqueue,name = global,expansion = global
 ………………
 ……………….

查询 2

presto:jmx> select * from jmx.current.”java.lang:type = compilation"; 

结果

node               | compilationtimemonitoringsupported |      name   |         objectname         | totalcompilationti
--------------------------------------+------------------------------------+--------------------------------+----------------------------+-------------------
ffffffff-ffff-ffff-ffff-ffffffffffff | true | HotSpot 64-Bit Tiered Compilers | java.lang:type=Compilation |       1276

查询 3

presto:jmx> select * from jmx.current."com.facebook.presto.server:name = taskresource";

结果

 node                 | readfromoutputbuffertime.alltime.count 
 | readfromoutputbuffertime.alltime.max | readfromoutputbuffertime.alltime.maxer
 --------------------------------------+---------------------------------------+--------------------------------------+--------------------------------------- 
 ffffffff-ffff-ffff-ffff-ffffffffffff |                                   92.0 |                          1.009106149 | 

Apache Presto - HIVE 连接器

Hive 连接器允许查询存储在 Hive 数据仓库中的数据。

先决条件

  • Hadoop
  • Hive

希望您已在您的机器上安装了 Hadoop 和 Hive。在一个新终端中依次启动所有服务。然后,使用以下命令启动 hive metastore,

hive --service metastore

Presto 使用 Hive metastore 服务获取 hive 表的详细信息。

配置设置

“etc/catalog”目录下创建一个名为“hive.properties”的文件。使用以下命令。

$ cd etc 
$ cd catalog 
$ vi hive.properties  

connector.name = hive-cdh4 
hive.metastore.uri = thrift://127.0.0.1:9083

完成所有更改后,保存文件并退出终端。

创建数据库

使用以下查询在 Hive 中创建数据库:

查询

hive> CREATE SCHEMA tutorials; 

创建数据库后,可以使用“show databases”命令进行验证。

创建表

Create Table 语句用于在 Hive 中创建表。例如,使用以下查询。

hive> create table author(auth_id int, auth_name varchar(50), 
topic varchar(100) STORED AS SEQUENCEFILE;

插入表

以下查询用于将记录插入 Hive 的表中。

hive> insert into table author values (1,’ Doug Cutting’,Hadoop),
(2,’ James Gosling’,java),(3,’ Dennis Ritchie’,C);

启动 Presto CLI

可以使用以下命令启动 Presto CLI 以连接 Hive 存储插件。

$ ./presto --server localhost:8080 --catalog hive —schema tutorials; 

您将收到以下响应。

presto:tutorials >

列出模式

要列出 Hive 连接器中的所有模式,请键入以下命令。

查询

presto:tutorials > show schemas from hive;

结果

default  

tutorials 

列出表

要列出“tutorials”模式中的所有表,请使用以下查询。

查询

presto:tutorials > show tables from hive.tutorials; 

结果

author

获取表

以下查询用于获取 Hive 表中的所有记录。

查询

presto:tutorials > select * from hive.tutorials.author; 

结果

auth_id  |   auth_name    | topic 
---------+----------------+-------- 
       1 | Doug Cutting   | Hadoop 
       2 | James Gosling  | java 
       3 | Dennis Ritchie | C

Apache Presto - KAFKA 连接器

Presto 的 Kafka 连接器允许使用 Presto 访问 Apache Kafka 中的数据。

先决条件

下载并安装以下 Apache 项目的最新版本。

  • Apache ZooKeeper
  • Apache Kafka

启动 ZooKeeper

使用以下命令启动 ZooKeeper 服务器。

$ bin/zookeeper-server-start.sh config/zookeeper.properties

现在,ZooKeeper 在 2181 端口上启动。

启动 Kafka

在另一个终端中使用以下命令启动 Kafka。

$ bin/kafka-server-start.sh config/server.properties

Kafka 启动后,它使用端口号 9092。

TPCH 数据

下载 tpch-kafka

$  curl -o kafka-tpch 
https://repo1.maven.org/maven2/de/softwareforge/kafka_tpch_0811/1.0/kafka_tpch_ 
0811-1.0.sh 

现在,您已使用上述命令从 Maven 中央下载了加载程序。您将收到类似以下的响应。

% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current 
                                 Dload  Upload   Total   Spent    Left  Speed 
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0  
  5 21.6M    5 1279k    0     0  83898      0  0:04:30  0:00:15  0:04:15  129k
  6 21.6M    6 1407k    0     0  86656      0  0:04:21  0:00:16  0:04:05  131k  
 24 21.6M   24 5439k    0     0   124k      0  0:02:57  0:00:43  0:02:14  175k 
 24 21.6M   24 5439k    0     0   124k      0  0:02:58  0:00:43  0:02:15  160k 
 25 21.6M   25 5736k    0     0   128k      0  0:02:52  0:00:44  0:02:08  181k 
 ………………………..

然后,使用以下命令使其可执行,

$ chmod 755 kafka-tpch

运行 tpch-kafka

使用以下命令运行 kafka-tpch 程序,以使用 tpch 数据预加载多个主题。

查询

$ ./kafka-tpch load --brokers localhost:9092 --prefix tpch. --tpch-type tiny 

结果

2016-07-13T16:15:52.083+0530 INFO main io.airlift.log.Logging Logging 
to stderr
2016-07-13T16:15:52.124+0530 INFO main de.softwareforge.kafka.LoadCommand
Processing tables: [customer, orders, lineitem, part, partsupp, supplier,
nation, region]
2016-07-13T16:15:52.834+0530 INFO pool-1-thread-1
de.softwareforge.kafka.LoadCommand Loading table 'customer' into topic 'tpch.customer'...
2016-07-13T16:15:52.834+0530 INFO pool-1-thread-2
de.softwareforge.kafka.LoadCommand Loading table 'orders' into topic 'tpch.orders'...
2016-07-13T16:15:52.834+0530 INFO pool-1-thread-3
de.softwareforge.kafka.LoadCommand Loading table 'lineitem' into topic 'tpch.lineitem'...
2016-07-13T16:15:52.834+0530 INFO pool-1-thread-4
de.softwareforge.kafka.LoadCommand Loading table 'part' into topic 'tpch.part'...
………………………
……………………….

现在,Kafka 表 customers、orders、supplier 等使用 tpch 加载。

添加配置设置

让我们在 Presto 服务器上添加以下 Kafka 连接器配置设置。

connector.name = kafka  

kafka.nodes = localhost:9092  

kafka.table-names = tpch.customer,tpch.orders,tpch.lineitem,tpch.part,tpch.partsupp, 
tpch.supplier,tpch.nation,tpch.region  

kafka.hide-internal-columns = false 

在上述配置中,Kafka 表使用 Kafka-tpch 程序加载。

启动 Presto CLI

使用以下命令启动 Presto CLI,

$ ./presto --server localhost:8080 --catalog kafka —schema tpch;

这里“tpch”是 Kafka 连接器的模式,您将收到以下响应。

presto:tpch>

列出表

以下查询列出“tpch”模式中的所有表。

查询

presto:tpch> show tables;

结果

  Table 
---------- 
 customer 
 lineitem 
 nation 
 orders
 part 
 partsupp 
 region 
 supplier 

描述 Customer 表

以下查询描述“customer”表。

查询

presto:tpch> describe customer; 

结果

  Column           |  Type   |                   Comment 
-------------------+---------+--------------------------------------------- 
 _partition_id     | bigint  | Partition Id 
 _partition_offset | bigint  | Offset for the message within the partition 
 _segment_start    | bigint  | Segment start offset 
 _segment_end      | bigint  | Segment end offset 
 _segment_count    | bigint  | Running message count per segment 
 _key              | varchar | Key text 
 _key_corrupt      | boolean | Key data is corrupt 
 _key_length       | bigint  | Total number of key bytes 
 _message          | varchar | Message text 
 _message_corrupt  | boolean | Message data is corrupt 
 _message_length   | bigint  | Total number of message bytes 

Apache Presto - JDBC 接口

Presto 的 JDBC 接口用于访问 Java 应用程序。

先决条件

安装 presto-jdbc-0.150.jar

您可以通过访问以下链接下载 JDBC jar 文件,

https://repo1.maven.org/maven2/com/facebook/presto/presto-jdbc/0.150/

下载 jar 文件后,将其添加到 Java 应用程序的类路径中。

创建一个简单的应用程序

让我们使用 JDBC 接口创建一个简单的 Java 应用程序。

编码 - PrestoJdbcSample.java

import java.sql.*; 
import com.facebook.presto.jdbc.PrestoDriver; 

//import presto jdbc driver packages here.  
public class PrestoJdbcSample {  
   public static void main(String[] args) {  
      Connection connection = null; 
      Statement statement = null;  
      try { 
         
         Class.forName("com.facebook.presto.jdbc.PrestoDriver");  
         connection = DriverManager.getConnection(
         "jdbc:presto://127.0.0.1:8080/mysql/tutorials", "tutorials", “"); 
         
         //connect mysql server tutorials database here 
         statement = connection.createStatement(); 
         String sql;  
         sql = "select auth_id, auth_name from mysql.tutorials.author”; 
        
         //select mysql table author table two columns  
         ResultSet resultSet = statement.executeQuery(sql);  
         while(resultSet.next()){  
            int id  = resultSet.getInt("auth_id"); 
            String name = resultSet.getString(“auth_name");  
            System.out.print("ID: " + id + ";\nName: " + name + "\n"); 
         }  
         
         resultSet.close(); 
         statement.close(); 
         connection.close(); 
         
      }catch(SQLException sqlException){ 
         sqlException.printStackTrace(); 
      }catch(Exception exception){ 
         exception.printStackTrace(); 
      } 
   } 
}

保存文件并退出应用程序。现在,在一个终端中启动 Presto 服务器,并打开一个新终端来编译和执行结果。以下是步骤:

编译

~/Workspace/presto/presto-jdbc $ javac -cp presto-jdbc-0.149.jar  PrestoJdbcSample.java

执行

~/Workspace/presto/presto-jdbc $ java -cp .:presto-jdbc-0.149.jar  PrestoJdbcSample

输出

INFO: Logging initialized @146ms  
ID: 1; 
Name: Doug Cutting 
ID: 2; 
Name: James Gosling 
ID: 3; 
Name: Dennis Ritchie 

Apache Presto - 自定义函数应用程序

创建一个 Maven 项目来开发 Presto 自定义函数。

SimpleFunctionsFactory.java

创建 SimpleFunctionsFactory 类以实现 FunctionFactory 接口。

package com.tutorialspoint.simple.functions;  

import com.facebook.presto.metadata.FunctionFactory; 
import com.facebook.presto.metadata.FunctionListBuilder; 
import com.facebook.presto.metadata.SqlFunction; 
import com.facebook.presto.spi.type.TypeManager;  
import java.util.List;  

public class SimpleFunctionFactory implements FunctionFactory { 
   
   private final TypeManager typeManager;  
   public SimpleFunctionFactory(TypeManager typeManager) { 
      this.typeManager = typeManager; 
   }  
    @Override 
    
   public List<SqlFunction> listFunctions() { 
      return new FunctionListBuilder(typeManager) 
      .scalar(SimpleFunctions.class) 
      .getFunctions(); 
   } 
}

SimpleFunctionsPlugin.java

创建一个 SimpleFunctionsPlugin 类以实现 Plugin 接口。

package com.tutorialspoint.simple.functions;  

import com.facebook.presto.metadata.FunctionFactory; 
import com.facebook.presto.spi.Plugin; 
import com.facebook.presto.spi.type.TypeManager; 
import com.google.common.collect.ImmutableList;  
import javax.inject.Inject; 
import java.util.List; 
import static java.util.Objects.requireNonNull;  

public class SimpleFunctionsPlugin implements Plugin {  
   private TypeManager typeManager; 
   @Inject 
   
   public void setTypeManager(TypeManager typeManager) { 
      this.typeManager = requireNonNull(typeManager, "typeManager is null”); 
      //Inject TypeManager class here 
   }  
   @Override 
   
   public <T> List<T> getServices(Class<T> type){ 
      if (type == FunctionFactory.class) { 
         return ImmutableList.of(type.cast(new SimpleFunctionFactory(typeManager))); 
      } 
      return ImmutableList.of(); 
   } 
}

添加资源文件

创建一个在实现包中指定的资源文件。

(com.tutorialspoint.simple.functions.SimpleFunctionsPlugin)

现在移动到资源文件位置 @ /path/to/resource/

然后添加更改,

com.facebook.presto.spi.Plugin 

pom.xml

将以下依赖项添加到 pom.xml 文件中。

<?xml version = "1.0"?> 
<project xmlns = "http://maven.apache.org/POM/4.0.0"  
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0  
    http://maven.apache.org/xsd/maven-4.0.0.xsd">  
   
   <modelVersion>4.0.0</modelVersion> 
   <groupId>com.tutorialspoint.simple.functions</groupId> 
   <artifactId>presto-simple-functions</artifactId>  
   <packaging>jar</packaging>  
   <version>1.0</version>
   <name>presto-simple-functions</name>
   <description>Simple test functions for Presto</description> 
   <properties> 
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>  
   <dependencies> 
      <dependency> 
         <groupId>com.facebook.presto</groupId> 
         <artifactId>presto-spi</artifactId>
         <version>0.149</version> 
      </dependency>  
      <dependency> 
         <groupId>com.facebook.presto</groupId> 
         <artifactId>presto-main</artifactId> 
         <version>0.149</version> 
      </dependency>  
      <dependency> 
         <groupId>javax.inject</groupId> 
         <artifactId>javax.inject</artifactId> 
         <version>1</version> 
      </dependency>  
      <dependency> 
         <groupId>com.google.guava</groupId> 
         <artifactId>guava</artifactId> 
         <version>19.0</version> 
      </dependency> 
   </dependencies>  
   <build> 
      <finalName>presto-simple-functions</finalName>  
      <plugins>  
      <!-- Make this jar executable --> 
         <plugin> 
            <groupId>org.apache.maven.plugins</groupId> 
            <artifactId>maven-jar-plugin</artifactId> 
            <version>2.3.2</version> 
         </plugin> 
      </plugins> 
   </build> 
</project>

SimpleFunctions.java

使用 Presto 属性创建 SimpleFunctions 类。

package com.tutorialspoint.simple.functions;  

import com.facebook.presto.operator.Description; 
import com.facebook.presto.operator.scalar.ScalarFunction; 
import com.facebook.presto.operator.scalar.StringFunctions; 
import com.facebook.presto.spi.type.StandardTypes; 
import com.facebook.presto.type.LiteralParameters; 
import com.facebook.presto.type.SqlType;  

public final class SimpleFunctions { 
   private SimpleFunctions() { 
   }  
    
   @Description("Returns summation of two numbers") 
   @ScalarFunction(“mysum") 
   //function name 
   @SqlType(StandardTypes.BIGINT) 
    
   public static long sum(@SqlType(StandardTypes.BIGINT) long num1, 
   @SqlType(StandardTypes.BIGINT) long num2) { 
      return num1 + num2; 
   } 
}

创建应用程序后,编译并执行应用程序。它将生成 JAR 文件。复制文件并将 JAR 文件移动到目标 Presto 服务器插件目录中。

编译

mvn compile

执行

mvn package

现在重新启动 Presto 服务器并连接 Presto 客户端。然后,按如下所述执行自定义函数应用程序:

$ ./presto --catalog mysql --schema default

查询

presto:default> select mysum(10,10);

结果

 _col0  
------- 
  20 
广告