【Impala】概念、原理、内外部shell、建库建表、分区、查询、自定义函数、存储压缩...

Impala是一款提供对HDFS和HBase数据的高性能、低延迟SQL查询的工具。它基于内存运算,无需磁盘I/O,支持DataLocality,但完全依赖Hive且只能读取文本文件。安装可通过Cloudera Manager,包括创建服务、角色分配等步骤。Impala提供了丰富的数据类型,如TINYINT、STRING、TIMESTAMP等,并支持创建数据库、表,以及分区操作。其查询语法与Hive类似,支持自定义函数。存储方面,Impala可以直接处理Parquet格式,但不支持直接插入SequenceFile格式的数据。

 一、基本概念

1、介绍

对HDFS、Hbase数据的高性能、低延迟的交互式SQL查询功能

2、优缺点

优点:基于内存运算,无需写入磁盘,无需转化为MR,支持Data Locality调度(数据和计算在一台机器进行)

缺点:完全依赖于hive,只能读取文本文件

3、组成

 4、原理

二、Impala安装

1、地址

http://impala.apache.org/impala-docs.html

2、安装方式

手动安装与CDH安装-Cloudera Manager

添加服务、角色分配、配置、启动

3、监护管理

StateStore:http://hadoop102:25020/

Catalog:http://hadoop102:25010/

4、入门

启动:impala-shell

查看数据库与表:show databases; / show tables;

导入数据:load data inpath '/student.txt' into table student;

修改hdfs的权限

三、操作命令

1、外部shell

连接指定主机:impala-shell -i hadoop103

查询表中数据并写入文件:impala-shell -q 'select * from student' -o output.txt

建表后刷新元数据:impala-shell -r

显示执行计划:impala-shell -p

去格式化输出:impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

2、内部shell

查看执行计划:explain select * from student;

查询最近一次的底层信息:profile;

刷新元数据:refresh student;

四、Impala数据类型

Hive数据类型

Impala数据类型

长度

TINYINT

TINYINT

1byte有符号整数

SMALINT

SMALINT

2byte有符号整数

INT

INT

4byte有符号整数

BIGINT

BIGINT

8byte有符号整数

BOOLEAN

BOOLEAN

布尔类型,true或者false

FLOAT

FLOAT

单精度浮点数

DOUBLE

DOUBLE

双精度浮点数

STRING

STRING

字符系列。可以指定字符集。可以使用单引号或者双引号。

TIMESTAMP

TIMESTAMP

时间类型

BINARY

不支持

字节数组

五、DDL数据定义

1、创建数据库

CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path];

2、查询数据库

显示数据库

show databases like 'hive*';

desc database hive_db;

删除数据库

drop database hive_db cascade;

3、创建表

管理表

[hadoop103:21000] > create table if not exists student2(
                  > id int, name string
                  > )
                  > row format delimited fields terminated by '\t'
                  > stored as textfile
                  > location '/user/hive/warehouse/student2';
[hadoop103:21000] > desc formatted student2;

外部表

[hadoop103:21000] > create external table stu_external(
                  > id int, 
                  > name string) 
                  > row format delimited fields terminated by '\t' ;

4、分区表

创建分区表

[hadoop103:21000] > create table stu_par(id int, name string)
                  > partitioned by (month string)
                  > row format delimited 
                  > fields terminated by '\t';

表中导入数据

[hadoop103:21000] > alter table stu_par add partition (month='201810');
[hadoop103:21000] > load data inpath '/student.txt' into table stu_par partition(month='201810');
[hadoop103:21000] > insert into table stu_par partition (month = '201811')
                  > select * from student;

查询数据

增加分区

删除分区

查看分区:show partitions stu_par;

六、DML数据操作

1、数据导入

2、数据导出

impala-shell -q 'select * from student' -B --output_delimiter="\t" -o output.txt

七、查询

与hive语法相似

八、函数

1、自定义函数

导入依赖hive-exec

创建类并打包

package com.atguigu.hive;
import org.apache.hadoop.hive.ql.exec.UDF;

public class Lower extends UDF {

    public String evaluate (final String s) {
        
        if (s == null) {
            return null;
        }
        
        return s.toLowerCase();
    }
}

创建函数:create function mylower(string) returns string location '/hive_udf-0.0.1-SNAPSHOT.jar' symbol='com.atguigu.hive_udf.Hive_UDF';

使用函数:select ename, mylower(ename) from emp;

通过show functions查看自定义的函数

九、存储和压缩

文件格式

压缩编码

Impala是否可直接创建

是否可直接插入

Parquet

Snappy(默认), GZIP;

Yes

支持:CREATE TABLE, INSERT, 查询

Text

LZO,gzip,bzip2,snappy

Yes. 不指定 STORED AS 子句的 CREATE TABLE 语句,默认的文件格式就是未压缩文本

支持:CREATE TABLE, INSERT, 查询。如果使用 LZO 压缩,则必须在 Hive 中创建表和加载数据

RCFile

Snappy, GZIP, deflate, BZIP2

Yes.

仅支持查询,在 Hive 中加载数据

SequenceFile

Snappy, GZIP, deflate, BZIP2

Yes.

仅支持查询,在 Hive 中加载数据

创建parquet格式的表并插入数据进行查询

[hadoop104:21000] > create table student2(id int, name string)
                  > row format delimited 
                  > fields terminated by '\t'
                  > stored as PARQUET;
[hadoop104:21000] > insert into table student2 values(1001,'zhangsan');
[hadoop104:21000] > select * from student2;

创建sequenceFile格式的表,插入数据时报错

[hadoop104:21000] > insert into table student3 values(1001,'zhangsan');
Query: insert into table student3 values(1001,'zhangsan')
Query submitted at: 2018-10-25 20:59:31 (Coordinator: http://hadoop104:25000)
Query progress can be monitored at: http://hadoop104:25000/query_plan?query_id=da4c59eb23481bdc:26f012ca00000000
WARNINGS: Writing to table format SEQUENCE_FILE is not supported. Use query option ALLOW_UNSUPPORTED_FORMATS to override.
### 将 Oracle 存储过程迁移到 Impala 的方法 Oracle 和 Impala 是两种完全不同的技术栈,前者是一个功能全面的关系型数据管理系统(RDBMS),支持复杂的存储过程和事务处理;后者是基于 Hadoop 的大规模并行处理(MPP)查询引擎,主要用于执行 SQL 查询和分析任务。由于 Impala 不支持存储过程或 PL/SQL,因此需要将逻辑存储过程转换为等效的 SQL 查询或其他脚本语言。 以下是实现迁移的关键点: #### 1. 理解 Oracle 存储过程的功能 在 Oracle 中,存储过程通常是用 PL/SQL 编写的,包含以下内容: - 数据操作语言(DML):如 `INSERT`、`UPDATE`、`DELETE`。 - 控制结构:如条件语句(`IF-THEN-ELSE`)、循环(`FOR`、`WHILE`)。 - 游标操作:用于逐行处理数据。 - 函数调用:可能涉及内置函数或用户定义函数。 这些功能需要被映射到 Impala 支持的特性中[^1]。 #### 2. 使用 Impala 的 SQL 功能替代存储过程 Impala 提供了强大的 SQL 查询能力,但不支持存储过程。可以通过以下方式实现等效功能: - **批量插入或更新**:使用 `INSERT INTO` 或 `INSERT OVERWRITE` 替代 Oracle 的 `INSERT` 和 `UPDATE` 操作。 - **条件逻辑**:通过 `CASE` 达式实现条件判断。 - **循环逻辑**:如果存储过程中有循环逻辑,可以将其转换为多次 SQL 查询或使用外部脚本(如 Python、Shell 脚本)来实现循环。 - **游标操作**:Impala 不支持游标,但如果需要逐行处理数据,可以考虑将数据导出到文件,然后使用外部工具进行处理。 #### 3. 数据类型和约束的映射 确保在 Impala 中正确映射 Oracle 的数据类型和约束: - **数据类型**:Oracle 的数据类型(如 `VARCHAR2`、`NUMBER`)需要转换为 Impala 支持的数据类型(如 `STRING`、`INT`、`FLOAT`)。 - **约束**:Impala 不直接支持外键约束或检查约束,但可以通过数据验证脚本或 ETL 流程来确保数据完整性[^1]。 #### 4. 定期维护和优化 - **性能优化**:Impala查询性能依赖于的设计和分区策略。确保按需分区,并定期清理过期数据。 - **错误处理**:在外部脚本中添加错误处理逻辑,以应对查询失败或其他异常情况。 #### 示例代码 假设有一个 Oracle 存储过程如下: ```sql CREATE OR REPLACE PROCEDURE update_employee_salary AS BEGIN FOR rec IN (SELECT employee_id, salary FROM employees WHERE department_id = 10) LOOP IF rec.salary < 5000 THEN UPDATE employees SET salary = salary * 1.1 WHERE employee_id = rec.employee_id; END IF; END LOOP; END; ``` 可以将其转换为 Impala 查询: ```sql -- 更新符合条件的员工工资 INSERT OVERWRITE TABLE employees SELECT employee_id, CASE WHEN department_id = 10 AND salary < 5000 THEN salary * 1.1 ELSE salary END AS salary, department_id FROM employees; ``` 如果需要更复杂的逻辑,可以使用 Python 脚本结合 Impala 的 JDBC/ODBC 驱动程序来实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值