七十三Impala的常用操作

Posted 象在舞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了七十三Impala的常用操作相关的知识,希望对你有一定的参考价值。

上一篇文章我们简单介绍了一下Impala以及如何安装部署Impala,本文我们从Impala的数据类型、DDL、DML、函数等方面来看一下Impala是如何操作的。关注专栏《破茧成蝶——大数据篇》,查看更多相关的内容~


目录

一、Impala的数据类型

二、Impala的操作命令

2.1 Impala的外部shell

2.2 Impala的内部shell

三、Impala的DDL数据定义语言

3.1 数据库操作

3.1.1 创建数据库

3.1.2 显示数据库

3.1.3 删除数据库

3.2 表操作

3.2.1 内部表

3.2.2 外部表

3.2.3 分区表

四、Impala的DML数据操作语言

4.1 数据导入

4.2 数据导出

4.3 查询

五、函数

5.1 自定义函数

六、压缩和存储

七、Impala的优化


一、Impala的数据类型

Impala与Hive的数据类型对比如下所示:

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

不支持

字节数组

这里需要注意的是,Impala虽然支持array,map,struct复杂数据类型,但是支持并不完全。

二、Impala的操作命令

2.1 Impala的外部shell

选项

描述

-h, --help

显示帮助信息

-v or --version

显示版本信息

-i hostname, --impalad=hostname

指定连接运行 impalad 守护进程的主机。默认端口是 21000。

-q query, --query=query

从命令行中传递一个shell 命令。执行完这一语句后 shell 会立即退出。

-f query_file, --query_file= query_file

传递一个文件中的 SQL 查询。文件内容必须以分号分隔

-o filename or --output_file filename

保存所有查询结果到指定的文件。通常用于保存在命令行使用 -q 选项执行单个查询时的查询结果。

-c

查询执行失败时继续执行

-d default_db or --database=default_db

指定启动后使用的数据库,与建立连接后使用use语句选择数据库作用相同,如果没有指定,那么使用default数据库

-r or --refresh_after_connect

建立连接后刷新 Impala 元数据

-p, --show_profiles

对 shell 中执行的每一个查询,显示其查询执行计划 

-B(--delimited)

去格式化输出

--output_delimiter=character

指定分隔符

--print_header

打印列名

2.2 Impala的内部shell

选项

描述

help

显示帮助信息

explain <sql>

显示执行计划

profile

(查询完成后执行) 查询最近一次查询的底层信息

shell <shell>

不退出impala-shell执行shell命令

version

显示版本信息(同于impala-shell -v)

connect

连接impalad主机,默认端口21000(同于impala-shell -i)

refresh <tablename>

增量刷新元数据库

invalidate metadata

全量刷新元数据库(慎用)(同于 impala-shell -r)

history

历史命令

 

三、Impala的DDL数据定义语言

3.1 数据库操作

3.1.1 创建数据库

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

这里需要注意的是,Impala不支持WITH DBPROPERTIE语法。

3.1.2 显示数据库

3.1.3 删除数据库

这里需要注意的是,当数据库在使用时是无法drop掉的。

3.2 表操作

3.2.1 内部表

create table if not exists people(
id int,
name string
)
row format delimited fields terminated by '\\t'
stored as textfile
location '/user/hive/warehouse/people';

3.2.2 外部表

create external table external_people(
id int, 
name string) 
row format delimited fields terminated by '\\t' ;

3.2.3 分区表

1、创建表

create table stu_par(id int, name string)
partitioned by (month string)
row format delimited 
fields terminated by '\\t';

2、插入数据

alter table stu_par add partition (month='201810');
load data inpath '/student.txt' into table stu_par partition(month='201810');

insert into table stu_par partition (month = '201811');

这里需要注意的是,如果分区没有,load data导入数据时,不能自动创建分区。

3、增加分区

alter table stu_par add partition (month='201812') partition (month='201813');

4、删除分区

alter table stu_par drop partition (month='201812');

5、查看分区

show partitions stu_par;

四、Impala的DML数据操作语言

4.1 数据导入

数据导入跟Hive的大同小异,可以参考Hive数据导入的操作,请点击这里。不过,同样需要注意的是,impala不支持load data local inpath,即它只能加载HDFS上面的文件。

4.2 数据导出

Impala不支持export和import命令,Impala数据导出一般使用impala -o命令。

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

4.3 查询

Impala的查询语法跟Hive的查询语句大体一样,可以参考Hive的查询语句。Impala不支持CLUSTER BY、DISTRIBUTE BY、SORT BY,Impala中不支持分桶表,不支持COLLECT_SET(col)和explode(col)函数,但是Impala支持开窗函数。

五、函数

5.1 自定义函数

1、添加依赖

<dependencies>
		<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
		<dependency>
			<groupId>org.apache.hive</groupId>
			<artifactId>hive-exec</artifactId>
			<version>1.2.1</version>
		</dependency>
</dependencies>

2、创建一个自定义函数类

package com.xzw.hive;

import org.apache.hadoop.hive.ql.exec.UDF;

/**
 * @author: xzw
 * @create_date: 2020/12/20 11:05
 * @desc: 将字符串转换为小写
 * @modifier:
 * @modified_date:
 * @desc:
 */
public class Lower extends UDF {

    /**
     * 执行计算的方法
     * @param orig 原始字符串
     * @return 返回转换为小写的字符串
     */
    public String evaluate(String orig) {
        if (null == orig)
            return null;

        return orig.toLowerCase();
    }

    public static void main(String[] args) {

    }
}

3、打包并上传到HDFS指定的目录

hdfs dfs -put impala_udf.jar /xzw/

4、创建函数

create function udf_lower(string) returns string location '/xzw/impala_udf.jar' symbol='com.xzw.hive.Lower';

5、使用自定义函数

select ename, udf_lower(ename) from emp;

六、压缩和存储

文件格式

压缩编码

Impala是否可直接创建

是否可直接插入

Parquet

Snappy(默认), GZIP;

Yes

支持:CREATE TABLE, INSERT, 查询

TextFile

LZO,gzip,bzip2,snappy

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

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

RCFile

Snappy, GZIP, deflate, BZIP2

Yes.

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

SequenceFile

Snappy, GZIP, deflate, BZIP2

Yes.

支持:CREATE TABLE, INSERT, 查询。需设置

这里需要注意的是,Impala不支持ORC格式。

七、Impala的优化

1、尽量将StateStore和Catalog单独部署到同一个节点,保证他们正常通信。

2、通过对Impala Daemon内存限制(默认256M)及StateStore工作线程数,来提高Impala的执行效率。

3、SQL优化,使用之前调用执行计划。

4、选择合适的文件格式进行存储,提高查询效率。

5、避免产生很多小文件(如果有其他程序产生的小文件,可以使用中间表,将小文件数据存放到中间表。然后通过insert…select…方式中间表的数据插入到最终表中)。

6、使用合适的分区技术,根据分区粒度测算。

7、使用compute stats进行表信息搜集,当一个内容表或分区明显变化,重新计算统计相关数据表或分区。因为行和不同值的数量差异可能导致Impala选择不同的连接顺序时进行查询。

8、网络io的优化:避免把整个数据发送到客户端;尽可能的做条件过滤;使用limit字句;输出文件时,避免使用美化输出;尽量少用全量元数据的刷新。

9、使用profile输出底层信息计划,在做相应环境优化。

 

以上就是本文的所有内容,比较简单。你们在此过程中遇到了什么问题,欢迎留言,让我看看你们都遇到了哪些问题~

以上是关于七十三Impala的常用操作的主要内容,如果未能解决你的问题,请参考以下文章

客快物流大数据项目(七十三):Impala数据导入方式

客快物流大数据项目(七十七):使用Impala对kudu更改表属性操作

客快物流大数据项目(七十六):使用Impala对kudu进行DML操作

客快物流大数据项目(七十五):使用impala创建kudu表

第七十三天

客快物流大数据项目(七十):Impala入门介绍