参考文章:https://www.cnblogs.com/qingyunzong/p/8746159.html
一、复合数据类型
1、array:ARRAY<data_type>
2、map:MAP<primitive_type, data_type>
3、struct:STRUCT<col_name:data_type>
现有数据如下:
1 huangbo guangzhou,xianggang,shenzhen a1:30,a2:20,a3:100 beijing,112233,13522334455,500
2 xuzheng xianggang b2:50,b3:40 tianjin,223344,13644556677,600
3 wangbaoqiang beijing,zhejinag c1:200 chongqinjg,334455,15622334455,20
建表语句:
use class;
create table cdt(
id int,
name string,
work_location array<string>,
piaofang map<string,bigint>,
address struct<location:string,zipcode:int,phone:string,value:int>
)
row format delimited
fields terminated by "\t"
collection items terminated by ","
map keys terminated by ":"
lines terminated by "\n";
导入数据:
> load data local inpath "/home/hadoop/cdt.txt" into table cdt;
查询显示后如下:
假若想查询address字段下的某个值,可以:
select address.location from cdt;
这样就只显示了字段下的某一个值:
4、union:UNIONTYPE<data_type,data_type,...>
Union类型可以在同一时间点,保持恰好有一个指定的数据类型。可以使用create_union的UDF创建一个实例的类型:
create table union_test(foo uniontype<int, double, array<string>, struct<a:int,b:string>>);
select foo from union_test;
{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}
在查询的结果中,第一部分对于union的反序列化来说是一个tag,让它知道union的哪个部分被使用。序号0,表示声明的第0个数据类型,即int,其他同理。
创建union,必须为create_union提供tag:
select create_union(0, key),
create_union(if(key<100, 0, 1), 2.0, value),
create_union(1, "a", struct(2, "b")
)
from src limit 2;
{0:"238"} {1:"val_238"} {1:{"col1":2,"col2":"b"}}
{0:"86"} {0:2.0} {1:{"col1":2,"col2":"b"}}
二、视图
1、Hive的视图与关系型数据库的视图区别
和关系型数据库一样,Hive也提供了视图的功能,不过存在以下区别:
(1)只有逻辑视图,没有物化视图;
(2)视图只能查询,不能load、insert、update、delete数据;
(3)视图在创建的时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询。
2、Hive视图的创建
create view view_cdt as select * from cdt;
3、Hive视图信息的查看
show views;
desc view_cdt;
4、Hive视图的使用
select * from view_cdt;
5、Hive视图的删除
drop view view_cdt;
三、函数
1、内置函数
(1)查看内置函数
show functions;
(2)显示函数的详细信息
desc function substr;
(3)显示函数的扩展信息
desc function extended substr;
2、自定义函数UDF
详见:https://www.cnblogs.com/qingyunzong/p/8746159.html
当 Hive 提供的内置函数无法满足业务处理需要时,此时就可以考虑使用用户自定义函数。
UDF(user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数,字符串函数)
UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多个输入数据行,并产生一个输出数据行。(count,max)
UDTF(表格生成函数 User-Defined Table Functions):接收一行输入,输出多行。(explode)
(1)简单的DUF示例
a. 导入hive需要的jar包,自定义一个java类继承UDF,重载 evaluate 方法;
b. 打成 jar 包上传到服务器;
c. 将 jar 包添加到 hive 的 classpath;
d. 创建临时函数与开发好的 class 关联起来;
e. 至此,便可以在 hql 在使用自定义的函数
(2)JSON数据解析UDF开发
……
(3)Transform实现
……
四、特殊分隔符处理
首先补充Hive读取数据的机制:
1、 首先用 InputFormat<默认是:org.apache.hadoop.mapred.TextInputFormat >的一个具体实 现类读入文件数据,返回一条一条的记录(可以是行,或者是你逻辑中的“行”)。
2、 然后利用 SerDe<默认:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe>的一个具体 实现类,对上面返回的一条一条的记录进行字段切割。
Hive 对文件中字段的分隔符默认情况下只支持单字节分隔符,如果数据文件中的分隔符是多 字符的,如下所示:
01||huangbo
02||xuzheng
03||wangbaoqiang
1、使用RegexSerDe正则表达式解析
创建表:
create table t_bi_reg(id string,name string)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties('input.regex'='(.*)\\|\\|(.*)','output.format.string'='%1$s %2$s')
stored as textfile;
导入数据并查询:
load data local inpath '/home/hadoop/data.txt' into table t_bi_reg;
select a.* from t_bi_reg a;