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 用户从千兆字节到 PB 级数据中提取最大的业务价值。
Apache Presto – 架构
Presto 的架构几乎类似于经典的 MPP(大规模并行处理)DBMS 架构。下图说明了 Presto 的架构。
上图由不同的组件组成。下表详细描述了每个组件。
S.No | 组件和描述 |
---|---|
1. |
Client 客户端 (Presto CLI) 将 SQL 语句提交给协调器以获取结果。 |
2. |
Coordinator Coordinator 是一个主守护进程。协调器首先解析 SQL 查询,然后分析和计划查询执行。调度程序执行管道执行,将工作分配给最近的节点并监控进度。 |
3. |
Connector 存储插件称为连接器。Hive、HBase、MySQL、Cassandra 等等都充当连接器;否则你也可以实现一个自定义的。连接器为查询提供元数据和数据。协调器使用连接器获取用于构建查询计划的元数据。 |
4. |
Worker 协调器将任务分配给工作节点。工作人员从连接器获取实际数据。最后,工作节点将结果传递给客户端。 |
Presto – 工作流程
Presto 是一个运行在节点集群上的分布式系统。Presto 的分布式查询引擎针对交互式分析进行了优化,并支持标准 ANSI SQL,包括复杂查询、聚合、连接和窗口函数。Presto 架构简单且可扩展。Presto 客户端 (CLI) 将 SQL 语句提交给主守护进程协调器。
调度器通过执行管道连接。调度程序将工作分配给最接近数据的节点并监控进度。协调器将任务分配给多个工作节点,最后工作节点将结果返回给客户端。客户端从输出过程中提取数据。可扩展性是关键设计。可插拔连接器,如 Hive、HBase、MySQL 等,为查询提供元数据和数据。Presto 采用“简单存储抽象”设计,可以轻松提供针对这些不同类型数据源的 SQL 查询功能。
执行模型
Presto 支持带有旨在支持 SQL 语义的运算符的自定义查询和执行引擎。除了改进调度之外,所有处理都在内存中,并通过网络在不同阶段之间进行流水线处理。这避免了不必要的 I/O 延迟开销。
Apache Presto – 安装
本章将解释如何在您的机器上安装 Presto。让我们来看看 Presto 的基本要求,
- Linux 或 Mac 操作系统
- 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目录,用于存放日志、元数据等,方便升级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是上面创建的数据目录的位置路径。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 = http://localhost:8080
这里,
-
协调器– 主节点。
-
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 – 发现服务器的 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 = http://localhost: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 = http://localhost: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”将安装在您的机器上。
运行命令行
下载 presto-cli 后,将其复制到要运行它的位置。该位置可以是对协调器具有网络访问权限的任何节点。首先将 Jar 文件的名称更改为 Presto。然后使用以下代码使用chmod &plus 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 Verifier 可用于针对另一个数据库(例如 MySQL)测试 Presto,或针对彼此测试两个 Presto 集群。
在 MySQL 中创建数据库
打开 MySQL 服务器并使用以下命令创建数据库。
create database 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://localhost:3306/tutorials?user=root&password=pwd control.gateway = jdbc:presto://localhost:8080 test.gateway = jdbc:presto://localhost:8080 thread-count = 1
在这里,在查询数据库字段中,输入以下详细信息 – 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 &ast from mysql.test.product 查询指的是mysql目录,test是数据库名,product是表名。这样,您就可以使用 Presto 服务器访问 mysql 连接器。
在这里,两个相同的选择查询相互测试以查看性能。同样,您可以运行其他查询来测试性能结果。您还可以连接两个 Presto 集群来检查性能结果。
Apache Presto – 管理工具
在本章中,我们将讨论 Presto 中使用的管理工具。让我们从 Presto 的 Web 界面开始。
网页界面
Presto 提供了一个用于监控和管理查询的 Web 界面。可以从协调器配置属性中指定的端口号访问它。
启动 Presto 服务器和 Presto CLI。然后您可以从以下 URL 访问 Web 界面 – http://localhost:8080/
输出将类似于上述屏幕。
在这里,主页有一个查询列表,以及诸如唯一查询 ID、查询文本、查询状态、完成百分比、用户名和发起此查询的来源等信息。最新查询首先运行,然后已完成或未完成的查询显示在底部。
在 Presto 上调整性能
如果 Presto 集群有任何与性能相关的问题,请将您的默认配置设置更改为以下设置。
配置属性
-
任务。info -refresh-max-wait – 减少协调器的工作量。
-
task.max-worker-threads – 拆分进程并分配给每个工作节点。
-
分布式连接启用– 基于哈希的分布式连接。
-
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 的基本数据类型。
S.No | 数据类型和描述 |
---|---|
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 给定组件类型的数组。例如,阵列[5,7] |
12. |
MAP 给定组件类型之间的映射。例如,MAP(ARRAY[‘one’,’two’],ARRAY[5,7]) |
13. |
ROW 由命名字段组成的行结构 |
Presto – 运营商
下表列出了 Presto 运算符。
S.No | 运算符和描述 |
---|---|
1. | Arithmetic operator
Presto 支持算术运算符,例如 &plus、-、&ast、/、% |
2. | Relational operator
<,>,<=,>=,=,<> |
3. | Logical operator
与、或、非 |
4. | Range operator
范围运算符用于测试特定范围内的值。Presto 支持 BETWEEN、IS NULL、IS NOT NULL、GREATEST 和 LEAST |
5. | Decimal operator
二元算术十进制运算符为十进制类型执行二进制算术运算 一元十进制运算符 – –运算符执行否定 |
6. | String operator
该“||” 运算符执行字符串连接 |
7. | Date and time operator
对日期和时间数据类型执行算术加减运算 |
8. | Array operator
下标运算符[] – 访问数组的元素 连接运算符 || – 将数组与数组或相同类型的元素连接起来 |
9. | Map operator
映射下标运算符 [] – 从映射中检索与给定键对应的值 |
Apache Presto – SQL 函数
到目前为止,我们正在讨论在 Presto 上运行一些简单的基本查询。本章将讨论重要的 SQL 函数。
数学函数
数学函数对数学公式进行运算。下表详细描述了功能列表。
S.No. | 功能说明 |
---|---|
1. | abs(x)
返回x的绝对值 |
2. | cbrt(x)
返回x的立方根 |
3. | ceiling(x)
返回四舍五入到最接近的整数的x值 |
4. |
ceil(x) 天花板 (x) 的别名 |
5. | degrees(x)
返回x的度数值 |
6. | e(x)
返回欧拉数的双精度值 |
7. |
exp(x) 返回欧拉数的指数值 |
8. | floor(x)
返回x向下舍入到最接近的整数 |
9. |
from_base(string,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() 返回圆周率值。结果将作为双精度值返回 |
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 1 如果参数大于 0 -1 如果参数小于 0 对于双参数,该函数还返回 – NaN 如果参数是 NaN 1 如果参数是 +Infinity -1 如果参数是 -Infinity |
25. | sqrt(x)
返回x 的平方根 |
26. | to_base(x,radix)
返回类型是弓箭手。结果作为x 的基数返回 |
27. | truncate(x)
截断x的值 |
28. | width_bucket(x, bound1, bound2, n)
返回x指定的 bound1 和 bound2 边界的 bin 编号和 n 个桶数 |
29. | width_bucket(x, bins)
根据数组 bins 指定的 bin 返回x的 bin 编号 |
三角函数
三角函数参数表示为 radians()。下表列出了这些功能。
S.No | 功能和说明 |
---|---|
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) |
按位函数
下表列出了按位函数。
S.No | 功能和说明 |
---|---|
1. | bit_count(x, bits)
计算位数 |
2. | bitwise_and(x,y)
对两位x和y执行按位与运算 |
3. | bitwise_or(x,y)
两位x, y之间的按位或运算 |
4. | bitwise_not(x)
位x 的按位非操作 |
5. | bitwise_xor(x,y)
位x, y 的异或运算 |
字符串函数
下表列出了字符串函数。
S.No | 功能和说明 |
---|---|
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)
在分隔符上拆分字符串并返回大小为最大限制的数组 |
12. | split_part(string, delimiter, index)
在分隔符上拆分字符串并返回字段索引 |
13. | strpos(string, substring)
返回子串在字符串中的起始位置 |
14. | substr(string, start)
返回给定字符串的子字符串 |
15. | substr(string, start, length)
返回具有特定长度的给定字符串的子字符串 |
16. | trim(string)
从字符串中删除前导和尾随空格 |
日期和时间函数
下表列出了日期和时间函数。
S.No | 功能和说明 |
---|---|
1. | current_date
返回当前日期 |
2. | current_time
返回当前时间 |
3. | current_timestamp
返回当前时间戳 |
4. | current_timezone()
返回当前时区 |
5. | now()
返回当前日期,带时区的时间戳 |
6. | localtime
返回当地时间 |
7. | localtimestamp
返回本地时间戳 |
正则表达式函数
下表列出了正则表达式函数。
S.No | 功能和说明 |
---|---|
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)
返回模式的字符串匹配。如果返回字符串,则该值将为真,否则为假 |
6. | regexp_replace(string, pattern)
用模式替换与表达式匹配的字符串实例 |
7. | regexp_replace(string, pattern, replacement)
用模式和替换替换与表达式匹配的字符串的实例 |
8. | regexp_split(string, pattern)
拆分给定模式的正则表达式 |
JSON 函数
下表列出了 JSON 函数。
S.No | 功能和说明 |
---|---|
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 函数。
S.No | 功能和说明 |
---|---|
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 的查询字符串 |
聚合函数
下表列出了聚合函数。
S.No | 功能和说明 |
---|---|
1. |
avg(x) 返回给定值的平均值 |
2. | min(x,n)
返回两个值中的最小值 |
3. | max(x,n)
返回两个值的最大值 |
4. | sum(x)
返回值的总和 |
5. | count(&ast)
返回输入行数 |
6. | count(x)
返回输入值的计数 |
7. | checksum(x)
返回x的校验和 |
8. | arbitrary(x)
返回x的任意值 |
颜色函数
下表列出了颜色函数。
S.No | 功能和说明 |
---|---|
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 颜色代码呈现绿色真或红色假 |
6. |
rgb(red, green, blue) 返回一个颜色值,它捕获三个分量颜色值的 RGB 值,作为整数参数提供,范围从 0 到 255 |
数组函数
下表列出了数组函数。
S.No | 功能和说明 |
---|---|
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)
在数组中查找给定元素。如果存在则返回真,否则返回假 |
7. | array_position(x,element)
查找给定元素在数组中的位置 |
8. | array_intersect(x,y)
执行两个数组之间的交集 |
9. | element_at(array,index)
返回数组元素位置 |
10. | slice(x,start,length)
对指定长度的数组元素进行切片 |
Teradata 函数
下表列出了 Teradata 函数。
S.No | 功能和说明 |
---|---|
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://localhost:3306 connection-user = root connection-password = pwd
保存文件并退出终端。在上面的文件中,您必须在 connection-password 字段中输入您的 mysql 密码。
在 MySQL 服务器中创建数据库
打开 MySQL 服务器并使用以下命令创建数据库。
create database 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>
这里的“教程”是指 mysql 服务器中的模式。
列出架构
要列出 mysql 中的所有模式,请在 Presto 服务器中键入以下查询。
询问
presto:tutorials> show schemas from mysql;
结果
Schema -------------------- information_schema performance_schema sys 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 连接器不支持创建表查询,但您可以使用 as 命令创建表。
询问
presto:tutorials> create table mysql.tutorials.sample as select * from mysql.tutorials.author;
结果
CREATE TABLE: 3 rows
您不能直接插入行,因为此连接器有一些限制。它不能支持以下查询 –
- 创造
- 插
- 更新
- 删除
- 降低
要查看新创建的表中的记录,请键入以下查询。
询问
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”文件。现在连接 Perst CLI 以启用 JMX 插件。
Presto 命令行界面
询问
$ ./presto --server localhost:8080 --catalog jmx --schema jmx
结果
您将收到以下回复。
presto:jmx>
JMX 架构
要列出“jmx”中的所有模式,请键入以下查询。
询问
presto:jmx> show schemas from jmx;
结果
Schema -------------------- information_schema 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
- 蜂巢
希望你已经在你的机器上安装了 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://localhost: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
列出表格
要列出“教程”模式中的所有表,请使用以下查询。
询问
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 项目的最新版本。
- 阿帕奇动物园管理员
- 卡夫卡
启动 ZooKeeper
使用以下命令启动 ZooKeeper 服务器。
$ bin/zookeeper-server-start.sh config/zookeeper.properties
现在,ZooKeeper 在 2181 上启动端口。
启动卡夫卡
使用以下命令在另一个终端中启动 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 表客户、订单、供应商等都使用 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
描述客户表
以下查询描述了“客户”表。
询问
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://localhost: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