- Apache Presto 教程
- Apache Presto - 首页
- Apache Presto - 概述
- Apache Presto - 架构
- Apache Presto - 安装
- Apache Presto - 配置
- Apache Presto - 管理
- Apache Presto - SQL 操作
- Apache Presto - SQL 函数
- Apache Presto - MySQL 连接器
- Apache Presto - JMX 连接器
- Apache Presto - HIVE 连接器
- Apache Presto - KAFKA 连接器
- Apache Presto - JDBC 接口
- 自定义函数应用
- Apache Presto 有用资源
- Apache Presto 快速指南
- Apache Presto - 有用资源
- Apache Presto - 讨论
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 的架构。
上图包含不同的组件。下表详细描述了每个组件。
序号 | 组件和描述 |
---|---|
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/
输出将类似于以上屏幕。
这里,主页列出了查询,以及唯一查询 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)
对两个位x和y执行按位 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