Apache Tajo - 快速指南


Apache Tajo - 简介

分布式数据仓库系统

数据仓库是一种关系数据库,旨在查询和分析而不是事务处理。它是一个面向主题的、集成的、时变的、非易失性的数据集合。这些数据可以帮助分析师在组织中做出明智的决策,但关系数据量正在日益增加。

为了克服这些挑战,分布式数据仓库系统在多个数据存储库之间共享数据,以实现在线分析处理(OLAP)。每个数据仓库可能属于一个或多个组织。它执行负载平衡和可扩展性。元数据被复制并集中分布。

Apache Tajo 是一个分布式数据仓库系统,它使用 Hadoop 分布式文件系统(HDFS)作为存储层,并拥有自己的查询执行引擎而不是 MapReduce 框架。

Hadoop 上的 SQL 概述

Hadoop 是一个开源框架,允许在分布式环境中存储和处理大数据。它速度极快且功能强大。然而,Hadoop 的查询能力有限,因此借助 SQL on Hadoop 可以进一步提高其性能。这允许用户通过简单的 SQL 命令与 Hadoop 交互。

Hadoop 应用程序上的 SQL 的一些示例包括 Hive、Impala、Drill、Presto、Spark、HAWQ 和 Apache Tajo。

什么是阿帕奇 Tajo

Apache Tajo 是一个关系型分布式数据处理框架。它专为低延迟和可扩展的即席查询分析而设计。

  • Tajo 支持标准 SQL 和各种数据格式。大多数 Tajo 查询无需任何修改即可执行。

  • Tajo通过失败任务的重启机制和可扩展的查询重写引擎实现容错。

  • Tajo 执行必要的ETL(提取转换和加载过程)操作来汇总存储在 HDFS 上的大型数据集。它是 Hive/Pig 的替代选择。

最新版本的 Tajo 与 Java 程序和第三方数据库(例如 Oracle 和 PostGreSQL)具有更好的连接性。

Apache Tajo 的特点

Apache Tajo 具有以下功能 -

  • 卓越的可扩展性和优化的性能
  • 低延迟
  • 用户定义函数
  • 行/列存储处理框架。
  • 与 HiveQL 和 Hive MetaStore 的兼容性
  • 数据流程简单,维护方便。

Apache Tajo 的优点

Apache Tajo 具有以下优点 -

  • 便于使用
  • 简化的架构
  • 基于成本的查询优化
  • 向量化查询执行计划
  • 交货快
  • 简单的I/O机制,支持多种类型的存储。
  • 容错能力

Apache Tajo 的用例

以下是 Apache Tajo 的一些用例 -

数据仓储和分析

韩国 SK Telecom 公司对 1.7 TB 的数据运行 Tajo,发现它可以比 Hive 或 Impala 更快地完成查询。

数据发现

韩国音乐流媒体服务 Melon 使用 Tajo 进行分析处理。Tajo 执行 ETL(提取-转换-加载过程)作业的速度比 Hive 快 1.5 到 10 倍。

日志分析

Bluehole Studio 是一家韩国公司,开发了《TERA》——一款奇幻多人在线游戏。该公司使用 Tajo 进行游戏日志分析并查找服务质量中断的主要原因。

存储和数据格式

Apache Tajo 支持以下数据格式 -

  • JSON
  • 文本文件(CSV)
  • 实木复合地板
  • 序列文件
  • AVRO
  • 协议缓冲区
  • 阿帕奇兽人

Tajo 支持以下存储格式 -

  • 分布式文件系统
  • 数据库连接
  • 亚马逊S3
  • 阿帕奇HBase
  • 弹性搜索

Apache Tajo - 架构

下图描述了 Apache Tajo 的架构。

建筑学

下表详细描述了每个组件。

编号 组件及描述
1

客户

Client将SQL语句提交给Tajo Master以获取结果。

2

掌握

Master 是主要守护进程。它负责查询规划,并且是工作人员的协调员。

3

目录服务器

维护表和索引的描述。它嵌入在主守护进程中。目录服务器使用 Apache Derby 作为存储层并通过 JDBC 客户端进行连接。

4

工人

主节点将任务分配给工作节点。TajoWorker 处理数据。随着TajoWorkers数量的增加,处理能力也线性增加。

5

查询大师

Tajo master 将查询分配给 Query Master。查询主机负责控制分布式执行计划。它启动 TaskRunner 并将任务安排到 TaskRunner。Query Master的主要作用是监控正在运行的任务并将其报告给Master节点。

6

节点管理器

管理worker节点的资源。它决定将请求分配给节点。

7

任务运行器

充当本地查询执行引擎。它用于运行和监视查询过程。TaskRunner 一次处理一个任务。

它具有以下三个主要属性 -

  • 逻辑计划- 创建任务的执行块。
  • 片段 - 输入路径、偏移范围和模式。
  • 获取 URI
8

查询执行器

它用于执行查询。

9

仓储服务

将底层数据存储连接到 Tajo。

工作流程

Tajo 使用 Hadoop 分布式文件系统(HDFS)作为存储层,并拥有自己的查询执行引擎而不是 MapReduce 框架。一个 Tajo 集群由一个主节点和跨集群节点的多个工作节点组成。

master主要负责查询规划,worker的协调者。master将查询分成小任务并分配给worker。每个工作线程都有一个本地查询引擎,用于执行物理运算符的有向无环图。

此外,Tajo可以比MapReduce更灵活地控制分布式数据流,并支持索引技术。

Tajo 基于网络的界面具有以下功能 -

  • 用于查找如何计划提交的查询的选项
  • 用于查找查询如何跨节点分布的选项
  • 检查集群和节点状态的选项

Apache Tajo - 安装

要安装 Apache Tajo,您的系统上必须有以下软件 -

  • Hadoop 版本 2.3 或更高版本
  • Java 版本 1.7 或更高版本
  • Linux 或 Mac 操作系统

现在让我们继续执行以下步骤来安装 Tajo。

验证 Java 安装

希望您已经在计算机上安装了 Java 版本 8。现在,您只需继续验证即可。

要验证,请使用以下命令 -

$ java -version

如果 Java 已成功安装在您的计算机上,您可以看到已安装 Java 的当前版本。如果未安装 Java,请按照以下步骤在您的计算机上安装 Java 8。

下载JDK

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

https://www.oracle.com

最新版本是JDK 8u 92,文件是“jdk-8u92-linux-x64.tar.gz”。请将文件下载到您的机器上。接下来,提取文件并将它们移动到特定目录。现在,设置 Java 替代项。最后,Java 安装在您的计算机上。

验证 Hadoop 安装

您已经在系统上安装了Hadoop 。现在,使用以下命令验证它 -

$ hadoop version 

如果您的设置一切正常,那么您可以看到 Hadoop 的版本。如果未安装 Hadoop,请访问以下链接下载并安装 Hadoop - https://www.apache.org

Apache Tajo 安装

Apache Tajo 提供两种执行模式——本地模式和完全分布式模式。验证 Java 和 Hadoop 安装后,请继续执行以下步骤在您的计算机上安装 Tajo 集群。本地模式 Tajo 实例需要非常简单的配置。

通过访问以下链接下载最新版本的 Tajo - https://www.apache.org/dyn/closer.cgi/tajo

现在您可以从您的计算机下载文件“tajo-0.11.3.tar.gz”

提取 Tar 文件

使用以下命令提取 tar 文件 -

$ cd opt/ 
$ tar tajo-0.11.3.tar.gz 
$ cd tajo-0.11.3

设置环境变量

将以下更改添加到“conf/tajo-env.sh”文件中

$ cd tajo-0.11.3 
$ vi conf/tajo-env.sh
 
# Hadoop home. Required 
export HADOOP_HOME = /Users/path/to/Hadoop/hadoop-2.6.2
 
# The java implementation to use.  Required. 
export JAVA_HOME = /path/to/jdk1.8.0_92.jdk/ 

在这里,您必须指定“tajo-env.sh”文件的 Hadoop 和 Java 路径。进行更改后,保存文件并退出终端。

启动 Tajo 服务器

要启动 Tajo 服务器,请执行以下命令 -

$ bin/start-tajo.sh 

您将收到类似于以下内容的回复 -

Starting single TajoMaster 
starting master, logging to /Users/path/to/Tajo/tajo-0.11.3/bin/../ 
localhost: starting worker, logging to /Users/path/toe/Tajo/tajo-0.11.3/bin/../logs/
 
Tajo master web UI: http://local:26080 
Tajo Client Service: local:26002

现在,输入命令“jps”来查看正在运行的守护进程。

$ jps  
1010 TajoWorker 
1140 Jps 
933 TajoMaster 

启动 Tajo Shell (Tsql)

要启动 Tajo shell 客户端,请使用以下命令 -

$ bin/tsql

您将收到以下输出 -

welcome to
   _____ ___  _____ ___ 
  /_  _/ _  |/_  _/   / 
   / // /_| |_/ // / / 
  /_//_/ /_/___/ \__/  0.11.3
  
Try \? for help. 

退出 Tajo 壳牌

执行以下命令退出 Tsql -

default> \q 
bye! 

这里默认是指Tajo中的目录。

网页用户界面

输入以下 URL 以启动 Tajo Web UI - http://localhost:26080/

您现在将看到以下屏幕,该屏幕与 ExecuteQuery 选项类似。

网页用户界面

停止塔霍

要停止 Tajo 服务器,请使用以下命令 -

$ bin/stop-tajo.sh 

您将得到以下响应 -

localhost: stopping worker 
stopping master

Apache Tajo - 配置设置

Tajo的配置是基于Hadoop的配置系统。本章详细介绍 Tajo 配置设置。

基本设置

Tajo 使用以下两个配置文件 -

  • Catalog-site.xml - 目录服务器的配置。
  • tajo-site.xml - 其他 Tajo 模块的配置。

分布式模式配置

分布式模式设置在 Hadoop 分布式文件系统 (HDFS) 上运行。让我们按照以下步骤配置 Tajo 分布式模式设置。

tajo-site.xml

该文件位于/path/to/tajo/conf目录中,并充当其他 Tajo 模块的配置。要以分布式模式访问 Tajo,请将以下更改应用于“tajo-site.xml”

<property> 
   <name>tajo.rootdir</name> 
   <value>hdfs://hostname:port/tajo</value> 
</property>
  
<property> 
   <name>tajo.master.umbilical-rpc.address</name> 
   <value>hostname:26001</value> 
</property> 
 
<property> 
   <name>tajo.master.client-rpc.address</name> 
   <value>hostname:26002</value> 
</property>
  
<property> 
   <name>tajo.catalog.client-rpc.address</name> 
   <value>hostname:26005</value> 
</property>   

主节点配置

Tajo 使用 HDFS 作为主要存储类型。配置如下,应添加到“tajo-site.xml”中。

<property> 
   <name>tajo.rootdir</name> 
   <value>hdfs://namenode_hostname:port/path</value> 
</property> 

目录配置

如果要自定义目录服务,请将$path/to/Tajo/conf/catalogsite.xml.template复制到$path/to/Tajo/conf/catalog-site.xml并根据需要添加以下任意配置。

例如,如果您使用“Hive Catalog Store”访问 Tajo,则配置应如下所示 -

<property> 
   <name>tajo.catalog.store.class</name> 
   <value>org.apache.tajo.catalog.store.HCatalogStore</value> 
</property> 

如果您需要存储MySQL目录,请应用以下更改 -

<property> 
   <name>tajo.catalog.store.class</name> 
   <value>org.apache.tajo.catalog.store.MySQLStore</value> 
</property> 

<property> 
   <name>tajo.catalog.jdbc.connection.id</name> 
   <value><mysql user name></value> 
</property>
 
<property> 
   <name>tajo.catalog.jdbc.connection.password</name> 
   <value><mysql user password></value> 
</property>
 
<property> 
   <name>tajo.catalog.jdbc.uri</name> 
   <value>jdbc:mysql://<mysql host name>:<mysql port>/<database name for tajo>
      ?createDatabaseIfNotExist = true</value> 
</property> 

同样,您可以在配置文件中注册其他 Tajo 支持的目录。

工作人员配置

默认情况下,TajoWorker 将临时数据存储在本地文件系统上。它在“tajo-site.xml”文件中定义如下 -

<property> 
   <name>tajo.worker.tmpdir.locations</name> 
   <value>/disk1/tmpdir,/disk2/tmpdir,/disk3/tmpdir</value> 
</property> 

要增加每个工作资源运行任务的能力,请选择以下配置 -

<property> 
   <name>tajo.worker.resource.cpu-cores</name> 
   <value>12</value> 
</property>
 
<property> 
   <name>tajo.task.resource.min.memory-mb</name> 
   <value>2000</value> 
</property>
  
<property> 
   <name>tajo.worker.resource.disks</name> 
   <value>4</value> 
</property> 

要使 Tajo Worker 在专用模式下运行,请选择以下配置 -

<property> 
   <name>tajo.worker.resource.dedicated</name> 
   <value>true</value> 
</property> 

Apache Tajo - Shell 命令

在本章中,我们将详细了解 Tajo Shell 命令。

要执行 Tajo shell 命令,您需要使用以下命令启动 Tajo 服务器和 Tajo shell -

启动服务器

$ bin/start-tajo.sh 

启动外壳

$ bin/tsql 

上面的命令现在可以执行了。

元命令

现在让我们讨论元命令。Tsql 元命令以反斜杠('\')开头。

帮助命令

“\?” 命令用于显示帮助选项。

询问

默认> \? 

结果

上面的\? 命令列出了 Tajo 中的所有基本使用选项。您将收到以下输出 -

命令

列出数据库

要列出 Tajo 中的所有数据库,请使用以下命令 -

询问

default> \l 

结果

您将收到以下输出 -

information_schema 
default

目前,我们还没有创建任何数据库,因此它显示了两个内置的 Tajo 数据库。

当前数据库

\c选项用于显示当前数据库名称。

询问

default> \c

结果

您现在已作为用户“username”连接到数据库“default”。

列出内置函数

要列出所有内置函数,请键入查询,如下所示 -

询问

default> \df 

结果

您将收到以下输出 -

列出内置函数

描述功能

\df 函数名称- 此查询返回给定函数的完整描述。

询问

default> \df sqrt 

结果

您将收到以下输出 -

描述功能

退出终端

要退出终端,请输入以下查询 -

询问

default> \q 

结果

您将收到以下输出 -

bye! 

管理命令

Tajo shell 提供\admin选项来列出所有管理功能。

询问

default> \admin 

结果

您将收到以下输出 -

管理命令

集群信息

要显示 Tajo 中的集群信息,请使用以下查询

询问

default> \admin -cluster 

结果

您将收到以下输出 -

集群信息

秀大师

以下查询显示当前的主信息。

询问

default> \admin -showmasters 

结果

localhost 

同样,您可以尝试其他管理命令。

会话变量

Tajo 客户端通过唯一的会话 ID 连接到 Master。会话一直有效,直到客户端断开连接或过期。

以下命令用于列出所有会话变量。

询问

default> \set 

结果

'SESSION_LAST_ACCESS_TIME' = '1470206387146' 
'CURRENT_DATABASE' = 'default' 
‘USERNAME’ = 'user' 
'SESSION_ID' = 'c60c9b20-dfba-404a-822f-182bc95d6c7c' 
'TIMEZONE' = 'Asia/Kolkata' 
'FETCH_ROWNUM' = '200' 
‘COMPRESSED_RESULT_TRANSFER' = 'false' 

\ set key val将使用值val设置名为key的会话变量。例如,

询问

default> \set ‘current_database’='default' 

结果

usage: \set [[NAME] VALUE] 

在这里,您可以在\set命令中分配键和值。如果需要恢复更改,请使用\unset命令。

Apache Tajo - 数据类型

要在 Tajo shell 中执行查询,请打开终端并移至 Tajo 安装目录,然后键入以下命令 -

$ bin/tsql 

您现在将看到如下程序所示的响应 -

default> 

您现在可以执行查询。否则,您可以通过 Web 控制台应用程序运行查询到以下 URL - http://localhost:26080/

原始数据类型

Apache Tajo 支持以下原始数据类型列表 -

编号 数据类型和描述
1

整数

用于存储整数值,存储空间为 4 字节。

2

小整数

小整数值是 1 个字节

3

小整数

用于存储小尺寸整数 2 字节值。

4

大整数

大范围整数值有 8 个字节存储。

5

布尔值

返回真/假。

6

真实的

用于存储实际值。大小为 4 字节。

7

漂浮

浮点精度值,有4或8字节存储空间。

8

双倍的

双点精度值存储在 8 个字节中。

9

字符[(n)]

人物价值。

10

varchar[(n)]

可变长度非 Unicode 数据。

11

数字

小数值。

12

二进制

二进制值。

13

日期

日历日期(年、月、日)。

示例- 日期“2016-08-22”

14

时间

没有时区的一天中的时间(小时、分钟、秒、毫秒)。这种类型的值在会话时区中进行解析和呈现。

15

时区

带有时区的一天中的时间(小时、分钟、秒、毫秒)。这种类型的值是使用值中的时区来呈现的。

示例- TIME '01:02:03.456 亚洲/加尔各答'

16

时间戳

即时时间,包括没有时区的日期和时间。

示例- TIMESTAMP '2016-08-22 03:04:05.321'

17 号

文本

可变长度 Unicode 文本。

Apache Tajo - 操作员

Tajo 中使用以下运算符来执行所需的操作。

编号 运算符及描述
1 算术运算符

Presto 支持 +、−、*、/、% 等算术运算符。

2 关系运算符

<、>、<=、>=、=、<>

3 逻辑运算符

与、或、非

4 字符串运算符

'||' 运算符执行字符串连接。

5 范围运算符

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

Apache Tajo - SQL 函数

到目前为止,您已经知道在 Tajo 上运行简单的基本查询。在接下来的几章中,我们将讨论以下 SQL 函数 -

Apache Tajo - 数学函数

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

编号 功能说明
1 绝对值(x)

返回 x 的绝对值。

2 CBRT(x)

返回 x 的立方根。

3 上限(x)

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

4 楼层(x)

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

5 圆周率()

返回 pi 值。结果将以双精度值形式返回。

6 弧度(x)

将角度 x 转换为度弧度。

7 度(x)

返回 x 的度值。

8 战俘(x,p)

返回值 'p' 的 x 值幂。

9 div(x,y)

返回给定两个 x,y 整数值的除法结果。

10 指数 (x)

返回欧拉数e的某个数次方。

11 开方(x)

返回 x 的平方根。

12 符号(x)

返回 x 的正负号函数,即 -

  • 如果参数为 0,则为 0

  • 如果参数大于 0,则为 1

  • 如果参数小于 0,则为 1

13 模(n,m)

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

14 轮(x)

返回 x 的舍入值。

15 余弦(x)

返回余弦值(x)。

16 阿信(x)

返回反正弦值 (x)。

17 号 acos(x)

返回反余弦值(x)。

18 阿坦(x)

返回反正切值 (x)。

19 atan2(y,x)

返回反正切值 (y/x)。

数据类型函数

下表列出了 Apache Tajo 中可用的数据类型函数。

编号 功能说明
1 到_bin(x)

返回整数的二进制表示形式。

2 to_char(int,文本)

将整数转换为字符串。

3 to_hex(x)

将 x 值转换为十六进制。

Apache Tajo - 字符串函数

下表列出了 Tajo 中的字符串函数。

编号 功能说明
1 连接(字符串1,...,字符串N)

连接给定的字符串。

2 长度(字符串)

返回给定字符串的长度。

3 较低(字符串)

返回字符串的小写格式。

4 上部(字符串)

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

5 ascii(字符串文本)

返回文本第一个字符的 ASCII 代码。

6 位长度(字符串文本)

返回字符串中的位数。

7 char_length(字符串文本)

返回字符串中的字符数。

8 八位字节长度(字符串文本)

返回字符串中的字节数。

9 摘要(输入文本,方法文本)

计算字符串的摘要哈希。这里,第二个arg方法指的是hash方法。

10 initcap(字符串文本)

将每个单词的第一个字母转换为大写。

11 md5(字符串文本)

计算字符串的MD5哈希值。

12 左(字符串文本,整数大小)

返回字符串中的前 n 个字符。

13 右(字符串文本,整数大小)

返回字符串中的最后 n 个字符。

14 定位(源文本,目标文本,起始索引)

返回指定子字符串的位置。

15 strposb(源文本,目标文本)

返回指定子字符串的二进制位置。

16 substr(源文本、起始索引、长度)

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

17 号 修剪(字符串文本[,字符文本])

删除字符串开头/结尾/两端的字符(默认为空格)。

18 split_part(字符串文本、分隔符文本、字段 int)

按分隔符拆分字符串并返回给定字段(从 1 开始计数)。

19 regexp_replace(字符串文本、模式文本、替换文本)

替换与给定正则表达式模式匹配的子字符串。

20 反转(字符串)

对字符串执行反向操作。

Apache Tajo - 日期时间函数

Apache Tajo 支持以下日期时间函数。

编号 功能说明
1 add_days(date 日期或时间戳, int 天

返回添加给定日期值的日期。

2 add_months(日期日期或时间戳,int月份)

返回添加给定月份值的日期。

3 当前日期()

返回今天的日期。

4 当前时间()

返回今天的时间。

5 提取(日期/时间戳的世纪)

从给定参数中提取世纪。

6 提取(日期/时间戳中的日期)

从给定参数中提取日期。

7 提取(从日期/时间戳算起的十年)

从给定参数中提取十年。

8 摘录(道琼斯指数日期/时间戳)

从给定参数中提取星期几。

9 提取(从日期/时间戳中提取)

从给定参数中提取一年中的某一天。

10 选择提取(时间戳中的小时)

从给定参数中提取小时。

11 选择提取(来自时间戳的 isodow)

从给定参数中提取星期几。除周日外,这与道琼斯指数相同。这与 ISO 8601 星期编号相匹配。

12 选择摘录(从日期开始的等年)

从指定日期提取 ISO 年份。ISO 年份可能与公历年份不同。

13 提取(时间微秒)

从给定参数中提取微秒。秒字段,包括小数部分,乘以 1 000 000;

14 提取(时间戳的千年)

从给定参数中提取千年。一千年对应于 1000 年。因此,第三个千年从 2001 年 1 月 1 日开始。

15 提取(从时间开始的毫秒数)

从给定参数中提取毫秒。

16 提取(时间戳中的分钟)

从给定参数中提取分钟。

17 号 提取(时间戳的四分之一)

从给定参数中提取一年中的季度 (1 - 4)。

18 date_part(字段文本、源日期或时间戳或时间)

从文本中提取日期字段。

19 现在()

返回当前时间戳。

20 to_char(时间戳,格式文本)

将时间戳转换为文本。

21 to_date(源文本,格式文本)

将文本转换为日期。

22 to_timestamp(源文本,格式文本)

将文本转换为时间戳。

Apache Tajo - JSON 函数

下表列出了 JSON 函数 -

编号 功能说明
1 json_extract_path_text(文本上的js,json_path文本)

根据指定的 json 路径从 JSON 字符串中提取 JSON 字符串。

2 json_array_get(json_array 文本,索引 int4)

将指定索引处的元素返回到 JSON 数组中。

3 json_array_contains(json_数组文本,任意值)

确定给定值是否存在于 JSON 数组中。

4 json_array_length(json_array 文本)

返回 json 数组的长度。

Apache Tajo - 数据库创建

本节介绍 Tajo DDL 命令。Tajo 有一个名为default的内置数据库。

创建数据库语句

Create Database是Tajo 中用于创建数据库的语句。该语句的语法如下 -

CREATE DATABASE [IF NOT EXISTS] <database_name> 

询问

default> default> create database if not exists test; 

结果

上述查询将生成以下结果。

OK

数据库是 Tajo 中的命名空间。一个数据库可以包含多个具有唯一名称的表。

显示当前数据库

要检查当前数据库名称,请发出以下命令 -

询问

default> \c 

结果

上述查询将生成以下结果。

You are now connected to database "default" as user “user1". 
default>  

连接到数据库

到目前为止,您已经创建了一个名为“test”的数据库。以下语法用于连接“test”数据库。

\c <database name> 

询问

default> \c test 

结果

上述查询将生成以下结果。

You are now connected to database "test" as user “user1”. 
test>

现在您可以看到从默认数据库到测试数据库的提示更改。

删除数据库

要删除数据库,请使用以下语法 -

DROP DATABASE <database-name> 

询问

test> \c default 
You are now connected to database "default" as user “user1". 
default> drop database test; 

结果

上述查询将生成以下结果。

OK 

Apache Tajo - 表管理

表是一个数据源的逻辑视图。它由逻辑架构、分区、URL 和各种属性组成。Tajo 表可以是 HDFS 中的一个目录、单个文件、一个 HBase 表或一个 RDBMS 表。

Tajo 支持以下两种类型的表 -

  • 外部表
  • 内表

外部表

外部表在创建时需要位置属性。例如,如果您的数据已作为文本/JSON 文件或 HBase 表存在,则可以将其注册为 Tajo 外部表。

以下查询是外部表创建的示例。

create external table sample(col1 int,col2 text,col3 int) location ‘hdfs://path/to/table';

这里,

  • 外部关键字- 用于创建外部表。这有助于在指定位置创建表。

  • Sample指的是表名。

  • 位置- 它是 HDFS、Amazon S3、HBase 或本地文件系统的目录。要为目录分配位置属性,请使用以下 URI 示例 -

    • HDFS - hdfs://localhost:端口/路径/到/表

    • Amazon S3 - s3://bucket-name/table

    • 本地文件系统- file:///path/to/table

    • Openstack Swift - swift://bucket-name/table

表属性

外部表具有以下属性 -

  • TimeZone - 用户可以指定读取或写入表的时区。

  • 压缩格式- 用于使数据大小紧凑。例如,text/json 文件使用compression.codec属性。

内表

内部表也称为托管表。它是在称为表空间的预定义物理位置中创建的。

句法

create table table1(col1 int,col2 text);

默认情况下,Tajo 使用位于“conf/tajo-site.xml”中的“tajo.warehouse.directory”。要为表分配新位置,您可以使用表空间配置。

表空间

表空间用于定义存储系统中的位置。仅内部表支持它。您可以通过表空间的名称来访问它们。每个表空间可以使用不同的存储类型。如果您不指定表空间,Tajo 将使用根目录中的默认表空间。

表空间配置

您在 Tajo 中有“conf/tajo-site.xml.template”。复制文件并将其重命名为“storagesite.json”。该文件将充当表空间的配置。Tajo 数据格式使用以下配置 -

HDFS配置

$ vi conf/storage-site.json { 
   "spaces": {  
      "${tablespace_name}": {  
         "uri": “hdfs://localhost:9000/path/to/Tajo"  
      } 
   } 
}

HBase配置

$ vi conf/storage-site.json { 
   "spaces": {  
      "${tablespace_name}": {  
         "uri": “hbase:zk://quorum1:port,quorum2:port/"  
      } 
   } 
}

文本文件配置

$ vi conf/storage-site.json { 
   "spaces": {  
      "${tablespace_name}": {  
         “uri”: “hdfs://localhost:9000/path/to/Tajo” 
      } 
   } 
}

表空间创建

Tajo 的内表记录只能从另一个表访问。您可以使用表空间对其进行配置。

句法

CREATE TABLE [IF NOT EXISTS] <table_name> [(column_list)] [TABLESPACE tablespace_name] 
[using <storage_type> [with (<key> = <value>, ...)]] [AS <select_statement>]

这里,

  • IF NOT EXISTS - 如果尚未创建相同的表,这可以避免错误。

  • TABLESPACE - 此子句用于分配表空间名称。

  • 存储类型- Tajo 数据支持文本、JSON、HBase、Parquet、Sequencefile 和 ORC 等格式。

  • AS select 语句- 从另一个表中选择记录。

配置表空间

启动 Hadoop 服务并打开文件“conf/storage-site.json”,然后添加以下更改 -

$ vi conf/storage-site.json { 
   "spaces": {  
      “space1”: {  
         "uri": “hdfs://localhost:9000/path/to/Tajo" 
      } 
   } 
} 

在这里,Tajo 将引用 HDFS 位置的数据,space1是表空间名称。如果不启动Hadoop服务,则无法注册表空间。

询问

default> create table table1(num1 int,num2 text,num3 float) tablespace space1;

上面的查询创建了一个名为“table1”的表,“space1”指的是表空间名称。

数据格式

Tajo 支持数据格式。让我们一一详细了解每种格式。

文本

字符分隔值的纯文本文件表示由行和列组成的表格数据集。每行都是纯文本行。

创建表

default> create external table customer(id int,name text,address text,age int) 
   using text with('text.delimiter'=',') location ‘file:/Users/workspace/Tajo/customers.csv’;

这里,“customers.csv”文件是指位于 Tajo 安装目录中的逗号分隔值文件。

要使用文本格式创建内部表,请使用以下查询 -

default> create table customer(id int,name text,address text,age int) using text; 

在上面的查询中,您没有分配任何表空间,因此它将采用 Tajo 的默认表空间。

特性

文本文件格式具有以下属性 -

  • text.delimiter - 这是一个分隔符。默认为“|”。

  • Compression.codec - 这是一种压缩格式。默认情况下,它是禁用的。您可以使用指定的算法更改设置。

  • timezone - 用于读取或写入的表。

  • text.error-tolerance.max-num - 容差级别的最大数量。

  • text.skip.headerlines - 每次跳过的标题行数。

  • text.serde - 这是序列化属性。

JSON

Apache Tajo 支持 JSON 格式来查询数据。Tajo 将 JSON 对象视为 SQL 记录。一个对象等于 Tajo 表中的一行。让我们考虑“array.json”,如下所示 -

$ hdfs dfs -cat /json/array.json { 
   "num1" : 10, 
   "num2" : "simple json array", 
   "num3" : 50.5 
}

创建此文件后,切换到 Tajo shell 并键入以下查询以使用 JSON 格式创建表。

询问

default> create external table sample (num1 int,num2 text,num3 float) 
   using json location ‘json/array.json’;

始终记住文件数据必须与表架构匹配。否则,您可以省略列名称并使用 *,这不需要列列表。

要创建内部表,请使用以下查询 -

default> create table sample (num1 int,num2 text,num3 float) using json;

实木复合地板

Parquet 是一种列式存储格式。Tajo 使用 Parquet 格式实现轻松、快速、高效的访问。

表创建

以下查询是创建表的示例 -

CREATE TABLE parquet (num1 int,num2 text,num3 float) USING PARQUET; 

Parquet 文件格式具有以下属性 -

  • parquet.block.size - 内存中缓冲的行组的大小。

  • parquet.page.size - 页面大小用于压缩。

  • parquet.compression - 用于压缩页面的压缩算法。

  • parquet.enable.dictionary - 布尔值用于启用/禁用字典编码。

RC文件

RCFile 是记录列式文件。它由二进制键/值对组成。

表创建

以下查询是创建表的示例 -

CREATE TABLE Record(num1 int,num2 text,num3 float) USING RCFILE; 

RCFile 具有以下属性 -

  • rcfile.serde - 自定义反序列化器类。

  • Compression.codec - 压缩算法。

  • rcfile.null - NULL 字符。

序列文件

SequenceFile 是 Hadoop 中的基本文件格式,由键/值对组成。

表创建

以下查询是创建表的示例 -

CREATE TABLE seq(num1 int,num2 text,num3 float) USING sequencefile; 

该序列文件具有 Hive 兼容性。这可以在 Hive 中写成:

CREATE TABLE table1 (id int, name string, score float, type string) 
STORED AS sequencefile; 

兽人

ORC(优化行列式)是 Hive 的列式存储格式。

表创建

以下查询是创建表的示例 -

CREATE TABLE optimized(num1 int,num2 text,num3 float) USING ORC; 

ORC 格式具有以下属性 -

  • orc.max.merge.distance - 读取 ORC 文件,当距离较小时进行合并。

  • orc.stripe.size - 这是每个条带的大小。

  • orc.buffer.size - 默认为 256KB。

  • orc.rowindex.stride - 这是 ORC 索引跨度(以行数为单位)。

Apache Tajo - SQL 语句

在上一章中,您已经了解了如何在 Tajo 中创建表。本章介绍 Tajo 中的 SQL 语句。

创建表语句

在创建表之前,请在 Tajo 安装目录路径中创建一个文本文件“students.csv”,如下所示 -

学生.csv

ID 姓名 地址 年龄 分数
1 亚当 新街23号 21 90
2 阿米特 老街12号 13 95
3 鲍勃 十字街10号 12 80
4 大卫 快捷大道15号 12 85
5 埃莎 花园街20号 13 50
6 恒河 北街25号 12 55
7 杰克 公园街2号 12 60
8 莉娜 南街24号 12 70
9 玛丽 西街5号 12 75
10 彼得 公园大道16号 12 95

创建文件后,移动到终端并一一启动 Tajo 服务器和 shell。

创建数据库

使用以下命令创建一个新数据库 -

询问

default> create database sampledb; 
OK

连接到现在创建的数据库“sampledb”。

default> \c sampledb 
You are now connected to database "sampledb" as user “user1”.

然后,在“sampledb”中创建一个表,如下所示 -

询问

sampledb>  create external table mytable(id int,name text,address text,age int,mark int) 
   using text with('text.delimiter' = ',') location ‘file:/Users/workspace/Tajo/students.csv’;

结果

上述查询将生成以下结果。

OK

到这里,外部表就创建完成了。现在,您只需输入文件位置即可。如果必须从 hdfs 分配表,请使用 hdfs 而不是文件。

接下来,“students.csv”文件包含逗号分隔值。text.delimiter字段分配有“,”。

您现在已经在“sampledb”中成功创建了“mytable”。

显示表

要显示 Tajo 中的表,请使用以下查询。

询问

sampledb> \d  
mytable  
sampledb> \d mytable

结果

上述查询将生成以下结果。

table name: sampledb.mytable 
table uri: file:/Users/workspace/Tajo/students.csv 
store type: TEXT 
number of rows: unknown 
volume: 261 B
Options: 
'timezone' = 'Asia/Kolkata' 
'text.null' = '\\N' 
'text.delimiter' = ','  
schema: 
id INT4 
name TEXT 
address TEXT 
age INT4 
mark INT4 

列表表

要获取表中的所有记录,请输入以下查询 -

询问

sampledb> select * from mytable;

结果

上述查询将生成以下结果。

列表表

插入表语句

Tajo 使用以下语法在表中插入记录。

句法

create table table1 (col1 int8, col2 text, col3 text);   
--schema should be same for target table schema  
Insert overwrite into table1 select * from table2;  
                     (or)  
Insert overwrite into LOCATION '/dir/subdir' select * from table; 

Tajo的insert语句类似于SQL的INSERT INTO SELECT语句。

询问

让我们创建一个表来覆盖现有表的表数据。

sampledb> create table test(sno int,name text,addr text,age int,mark int);  
OK 
sampledb> \d

结果

上述查询将生成以下结果。

mytable 
test

插入记录

要在“test”表中插入记录,请键入以下查询。

询问

sampledb> insert overwrite into test select * from mytable; 

结果

上述查询将生成以下结果。

Progress: 100%, response time: 0.518 sec

这里,“mytable”记录覆盖“test”表。如果您不想创建“test”表,则立即分配物理路径位置,如插入查询的替代选项中所述。

获取记录

使用以下查询列出“test”表中的所有记录 -

询问

sampledb> select * from test;

结果

上述查询将生成以下结果。

获取记录

该语句用于添加、删除或修改现有表的列。

要重命名表,请使用以下语法 -

Alter table table1 RENAME TO table2;

询问

sampledb> alter table test rename to students;

结果

上述查询将生成以下结果。

OK

要检查更改后的表名称,请使用以下查询。

sampledb> \d  
mytable 
students

现在表“test”更改为“students”表。

添加列

要在“students”表中插入新列,请输入以下语法 -

Alter table <table_name> ADD COLUMN <column_name> <data_type>

询问

sampledb> alter table students add column grade text; 

结果

上述查询将生成以下结果。

OK

设置属性

该属性用于更改表的属性。

询问

sampledb> ALTER TABLE students SET PROPERTY 'compression.type' = 'RECORD',
   'compression.codec' = 'org.apache.hadoop.io.compress.Snappy Codec' ; 
OK

这里分配压缩类型和编解码器属性。

要更改文本分隔符属性,请使用以下命令 -

询问

ALTER TABLE students  SET PROPERTY ‘text.delimiter'=',';  
OK