- orcfile:rcfile的升级版

发布时间:2025-06-24 19:52:31  作者:北方职教升学中心  阅读量:740


复杂数据类型处理

5、

1)hive在map阶段压缩

map阶段的设置, 就是在MapReduce的shuffle阶段对mapper产生的中间结果数据压缩 。

创建表的时候,假如指定了某个Serde 就说明,默认解析格式被修改了,需要按照指定的格式进行解析。SEQUENCEFILE、b、具体的Serde

l csv: 逗号分隔值

l tsv: tab分隔值

l json: json格式的数据 --在mr中,看见json数据,使用工具类解析 fastjson,jackson,gson等

l regexp: 数据需要复合正则表达式

以上这些分隔符都不是默认分隔符,默认分隔符是:^A 或者 \001

^A八进制编码体现为'\001'

它使用的类是serde这个工具包中的哪个类呢?--> LazySimpleSerDe

每一个分隔符,都对应一个具体的类。

可以理解为分隔符,每一个分隔符都应的都有 某个具体的Serde 工具类。网络传输,对象必须序列化。

行式存储:查找某一条整行数据比较快

列式存储:查找某个字段比较快 select name from user;

修改hive的默认存储格式:

<property>  <name>hive.default.fileformat</name>  <value>TextFile</value>  <description>    Expects one of [textfile, sequencefile, rcfile, orc].    Default file format for CREATE TABLE statement. Users can explicitly override it by CREATE TABLE ... STORED AS [FORMAT]  </description></property>也可以使用set方式修改:set hive.default.fileformat=TextFile

3)实操一下:

首先将一个18.1M的数据上传至 /home/hivedata/,这个文件叫做stocks.log

textfile类型演示:

create table stocks_1 (  track_time string,  url string,  session_id string,  referer string,  ip string,  end_user_id string,  city_id string)row format delimited fields terminated by '\t'stored as textfile;load data local inpath '/home/hivedata/stocks.log' into table stocks_1;在linux的命令行上使用hdfs dfs -put方法去上传到指定目录下。 --><property>  <name>hive.exec.compress.output</name>  <value>false</value></property>注意:如果开启,默认使用中间压缩配置的压缩编码器和压缩类型

3)常见的压缩类型

企业中一般使用snappy和lzo进行压缩。理论 json serde 可以是自己写的jar包也可以是第三方的jar包,要把这种jar包添加到hive的class path中2、

select过程

读取磁盘上的数据,创建row对象,这种从磁盘读取文件并转换为对象的过程称之为反序列化,底层用到了InputFormat。Regex Serde

三、hive的存储格式

1) 四种存储格式

hive的存储格式分为两大类:一类纯文本文件,一类是二进制文件存储。

创建一个视图:

create view v_emp_dept asselect emp.*,dept.dname,dept.loc from emp join dept on emp.deptno=dept.deptno;

使用视图:

select * from v_emp_dept where deptno=30;

删除视图:

drop view v_emp_dept;

以上是mysql视图的演示,hive也支持视图:

create view if not exists v_1 as select * from t_user  ;show tables; 
show create table v_1; desc v_1;
drop view if exists v_1;

hive 高版本的不支持索引了,所以使用 datagrip 的时候,hive.log 中会出现大量的错误。

三、

序列化与反序列化就需要用到分隔符

1|张三|20 解析 分隔符 | --> Row对象 --> Hive --> HDFS 对象的序列化

由上面可知,分隔符在序列化与反序列化的过程中非常的重要,所以要重点学习一下。Hive 比如 select * from t_user; --> 查询就是硬盘的数据变为控制台输出的数据,这个过程是反序列化的。实践 将jar包放置在/opt/modules文件夹下,然后在hive中执行如下命令: add jar /opt/modules/json-serde-1.3.8-jar-with-dependencies.jar;

先有json数据:

{"uid":"1","uname":"gaoyuanyuan","age":"18"}{"uid":"2","uname":"gaolaozhuang","age":"42"}
create table if not exists json1(uid int,uname string,age int)row format serde 'org.openx.data.jsonserde.JsonSerDe';org.openx.data.jsonserde.JsonSerDe 这个类是第三方的类,所以要导入包

加载数据并查询:

load data local inpath '/home/hivedata/json1.txt' into table json1;hive > select * from json1;OKjson1.uid       json1.uname     json1.age1       gaoyuanyuan     182       gaolaozhuang    42

第二个json解析的类,hive自带的:

'org.apache.hive.hcatalog.data.JsonSerDe'新建表:create table if not exists json2(uid int,uname string,age int)row format serde 'org.apache.hive.hcatalog.data.JsonSerDe';导入数据:load data local inpath '/home/hivedata/json1.txt' into table json2;导入之后:查询 select * from json2;
以上错误的意思是数据类型不匹配,表和数据的类型不匹配。json serde [最重要]

1、

目录

一、json serde [最重要]

4、

Hive支持的存储数据的格式主要有:TEXTFILE、具体的Serde

1、

1、PARQUET

第一类:纯文本文件存储

textfile: 纯文本文件存储格式,不压缩,也是hive的默认存储格式,磁盘开销大,数据解析开销大

第二类:二进制文件存储

- sequencefile:

会压缩,不能使用load方式加载数据

- parquet:

会压缩,不能使用load方式加载数据

- rcfile:

会压缩,不能load。

- orcfile:rcfile的升级版。d、复杂数据类型处理

数据如下所示:json2.txt 中的数据如下:zs math:100,98,76 chinese:98,96,100 english:100,99,90  ls math:60,80,70 chinese:90,66,91 english:50,51,70  思路是,将这个数据变为json(写java代码就可以)  jackson、查询性能高,写操作慢,所需内存大,计算量大。3三名学生选修了a、

具体来讲,就是依据serde这个工具包:

SerDe是“Serializer and Deserializer”的简称。跟虚拟表的区别是:创建了视图,可以反复使用,不会因为你关闭客户端而消失。c、因为map阶段要将数据传递给reduce阶段,使用压缩可以提高传输效率。

2)列式存储和行式存储

TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;

ORC和PARQUET是基于列式存储的。fastjson、视图 view


一、

ClassNotFindExcption --> 一看到这个就是缺 jar 包

json格式数据表需要通过serde机制处理在/opt/installs/hive/conf 下 找到 hive-site.xml 修改里面的值在hive-site.xml中设置三方jar包  <property>    <name>hive.aux.jars.path</name>    <value>/opt/installs/hive/lib/</value>  </property>

添加配置文件后还要重启metastore以及hive客户端。序列化与反列化

二、

4、2、使用默认分隔符进行演示

- 行分隔符:\n- 列分隔符:^A

创建数据:

1001^Azs^A231002^Alisi^A24此处不要copy,copy也没有用,认真看注意事项中的文字

新建表:

create table if not exists csv1(uid int,uname string,age int);-- 格式都没有指定,默认使用的就是LazySimpleSerde,记录分隔符是\n,列分隔符是^A由于我们这个数据,它是用的默认分隔符,所以建表的时候不需要指定分隔符

加载数据:

load data local inpath '/home/hivedata/csv1.txt' overwrite into table csv1;

查询结果,发现数据正常导入。使用默认分隔符进行演示

2、在hive0.11中,自带了两个RegexSerDe类:org.apache.Hadoop.hive.contrib.serde2.RegexSerDe;org.apache.hadoop.hive.serde2.RegexSerDe;这两个类的区别在:org.apache.hadoop.hive.serde2.RegexSerDe; 不支持output.format.string设定,设定了还会报警~~~~org.apache.hadoop.hive.contrib.serde2.RegexSerDe;全部支持,功能比org.apache.hadoop.hive.serde2.RegexSerDe更强大,推荐使用org.apache.hadoop.hive.contrib.serde2.RegexSerDe。使用逗号分隔符 csv

分隔符:列分隔符:逗号

常见数据: csv2.txt

1001,zs,231002,lisi,24

新建表:

create table if not exists csv2(uid int,uname string,age int)row format delimitedfields terminated by ',';hive > load data local inpath '/home/hivedata/csv2.txt' overwrite into table csv2;Loading data to table databaseName.csv2OKTime taken: 0.552 secondshive > select * from csv2;OKcsv2.uid        csv2.uname      csv2.age1001    zs      231002    lisi    24Time taken: 0.506 seconds, Fetched: 2 row(s)desc formatted csv2;  查看表结构

第二种建表语句:

drop table csv2;create table if not exists csv2(uid int,uname string,age int)row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde';# Storage Information            SerDe Library:          org.apache.hadoop.hive.serde2.OpenCSVSerde       InputFormat:            org.apache.hadoop.mapred.TextInputFormat         OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat       Compressed:             No                       Num Buckets:            -1                       Bucket Columns:         []                       Sort Columns:           []                       Storage Desc Params:                     serialization.format    1                   Time taken: 0.186 seconds, Fetched: 33 row(s)数据导入并查看:hive > load data local inpath '/home/hivedata/csv2.txt' overwrite into table csv2;hive > select * from csv2;

OpenCSVSerde还可以自定义分隔符

假如数据如下所示:使用数字7作为分隔符

10017zs72310027lisi724

新建表:

create table if not exists csv3(uid int,uname string,age int)row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'with serdeproperties("separatorChar"="7");数据导入并查看:hive > load data local inpath '/home/hivedata/csv3.txt' overwrite into table csv3;hive > select * from csv3;

3、MapReduce Hadoop抛弃了java的序列化方式,自己又创建了一套,implements Writable,原因是 Java的序列化 出来的数据太大了。

假如 insert into t_user values(1,"张三") ; --> 将一个对象变为了一个hdfs上的数据 ,这个过程是序列化。

RegexSerDe类是hive自带的,使用正则表达式来支持复杂的data导入。Hive的压缩【是优化手段之一】

hive的压缩使用的是工具压缩,跟存储格式自带压缩不是一回事儿。使用逗号分隔符 csv

OpenCSVSerde还可以自定义分隔符

3、此格式为行列混合存储,hive在该格式下,会尽量将附近的行和列的块存储到一起。Regex Serde

数据准备:

01||zhangsan||2302||lisi||24

创建一个表:

create table if not exists t_regex(  id string,  uname string,  age int)row format delimitedfields terminated by '||';加载数据:load data local inpath '/home/hivedata/regex.txt' into table t_regex;hive > select * from t_regex;OKt_regex.id      t_regex.uname   t_regex.age01              NULL02              NULLTime taken: 0.425 seconds, Fetched: 2 row(s)发现解析是有问题的,只解析了一个 | 使用正则表达式解析:drop table t_regex;create table if not exists t_regex(  id string,  uname string,  age int)row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'with serdeproperties(  'input.regex'='(.*)\\|\\|(.*)\\|\\|(.*)',  'output.format.string'='%1$s %2$s %3$s')stored as textfile;加载数据:load data local inpath '/home/hivedata/regex.txt' into table t_regex;hive > select * from t_regex;OKt_regex.id      t_regex.uname   t_regex.age01      zhangsan        2302      lisi    24Time taken: 0.351 seconds, Fetched: 2 row(s)结论是:不设置output.format.string  也是可以的。e、f中的若干课程id  course1   a1   b1   c1   e2   a2   c2   d2   f3   a3   b3   c3   e根据如上数据,查询出如下结果,其中1表示选修,0表示未选修id  a  b  c  d  e  f1   1  1  1  0  1  02   1  0  1  1  0  13   1  1  1  0  1  0SQL:--第一种方法select id,       sum(case when course='a' then 1 else 0 end ) a,       sum(case when course='b' then 1 else 0 end ) b,       sum(case when course='c' then 1 else 0 end ) c,       sum(case when course='d' then 1 else 0 end ) d,       sum(case when course='e' then 1 else 0 end ) e,       sum(case when course='f' then 1 else 0 end ) f       from zhoukao03 group by id;--第二种方法select id,       if(array_contains(collect_set(course),'a'),1,0) a,       if(array_contains(collect_set(course),'b'),1,0) b,       if(array_contains(collect_set(course),'c'),1,0) c,       if(array_contains(collect_set(course),'d'),1,0) d,       if(array_contains(collect_set(course),'e'),1,0) e,       if(array_contains(collect_set(course),'f'),1,0) f       from courses group by id;假如查询出如下结果id     a        b          c         d            e            f1   选修  选修      选修   未选修    选修      未选修2   选修  未选修  选修    选修      未选修   选修3   选修  选修     选修    未选修    选修      未选修create  table courses (id  int,course string)row format delimitedfields terminated by '\t'; load data local inpath '/home/hivedata/zuoye5.txt' into table courses; select id,       if(array_contains(collect_set(course),'a'),'选修','未选修') a,       if(array_contains(collect_set(course),'b'),'选修','未选修') b,       if(array_contains(collect_set(course),'c'),'选修','未选修') c,       if(array_contains(collect_set(course),'d'),'选修','未选修') d,       if(array_contains(collect_set(course),'e'),'选修','未选修') e,       if(array_contains(collect_set(course),'f'),'选修','未选修') f       from courses group by id;

HQL语句最终会被编译成Hadoop的Mapreduce job,因此hive的压缩设置,实际上就是对底层MR在处理数据时的压缩设置。修改表的字段类型:drop table json2;create table if not exists json2(uid string,uname string,age string)row format serde 'org.apache.hive.hcatalog.data.JsonSerDe';

假如以上使用时报类找不到异常,需要指定hive中lib的位置,一般是不报错的。

<!-- 指定要不要开启中间压缩 --><property>    <name>hive.exec.compress.intermediate</name>    <value>false</value></property><!-- 指定中间压缩想要使用的压缩编码器(类文件) --><property>    <name>hive.intermediate.compression.codec</name>    <value/></property><!-- 指定压缩编码器中的那种压缩类型 --><property>    <name>hive.intermediate.compression.type</name>    <value/></property>

2)hive在reduce阶段的压缩

<!-- 指定要不要开启最终压缩。hive的存储格式

textfile类型演示:

sequencefile 的使用

parquetfile 类型

rcfile类型:

orcfile类型:rcfile的升级版

四、Hive的压缩【是优化手段之一】

五、

复习mysql的视图:

类似于虚拟表或者临时表,本身不存储数据。ORC、

sequencefile 的使用

create external table if not exists stocks_seq_1 (  track_time string,  url string,  session_id string,  referer string,  ip string,  end_user_id string,  city_id string)row format delimited fields terminated by '\t'stored as sequencefile;由于不能load数据,从普通表中查询出来插入进入。Java的序列化 (implements Serializable) 讲IO流以及Web开发的时候

2、HDFS文件-> InputFileFormat -> <key,value> -> Deserializer -> Row对象Row对象->Serializer -> <key,value> -> OutputFileFormat -> HDFS文件

二、

可以查看到数据,说明是文本类型的。

2、

3、

5、对象可以想象为活物。硬盘、下面对RegexSerDe类的介绍都是指:org.apache.hadoop.hive.contrib.serde2.RegexSerDe

[08S01][1] Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. java.lang.RuntimeException: MetaException(message:org.apache.hadoop.hive.serde2.SerDeException org.apache.hadoop.hive.contrib.serde2.RegexSerDe only accepts string columns, but column[0] named uid has type int)

总结:

Serde 其实就是序列化与反序列化,它的本质上讲的是如何解析文档数据,进入hive,如何从hive展示数据。视图 view

这个来自于数据库,mysql就有视图。 在这个阶段,优先选择一个低CPU开销的算法。创建视图的语句:create view 视图的名字 as select 语句。

insert过程

将内存中的row对象,存储为磁盘上的数据,这个过程是序列化的过程,底层用到了OutputFormat。

1、

四、使用insert into的方式加载数据insert into stocks_seq_1 select * from stocks_1 ;或者使用克隆的方式:create table stocks_seq_2 stored as sequencefile as select * from stocks_1;

查看数据,是乱码,说明是二进制文件

parquetfile 类型

create external table if not exists stocks_parquet (track_time string,url string,session_id string,referer string,ip string,end_user_id string,city_id string)row format delimitedfields terminated by '\t'stored as parquet;使用insert into的方式加载数据insert into stocks_parquet select * from stocks_1 ;或者使用克隆的方式:create table stocks_parquet_1 stored as parquet as select * from stocks_1;

rcfile类型:

create external table if not exists stocks_rcfile (track_time string,url string,session_id string,referer string,ip string,end_user_id string,city_id string)row format delimitedfields terminated by '\t'stored as rcfile;使用insert into的方式加载数据insert into stocks_rcfile select * from stocks_1;或者使用克隆的方式:create table stocks_rcfile_2 stored as rcfile as select * from stocks_1;

orcfile类型:rcfile的升级版

create external table if not exists stocks_orcfile (track_time string,url string,session_id string,referer string,ip string,end_user_id string,city_id string)row format delimitedfields terminated by ','stored as orcfile;使用insert into的方式加载数据insert into stocks_orcfile select * from stocks_1;或者使用克隆的方式:create table stocks_orcfile_2 stored as orcfile as select * from stocks_1;

查询速度和压缩比例对比:

select count(*) from stocks_1;select count(*) from stocks_seq_1;select count(*) from stocks_parquet;       select count(*) from stocks_rcfile;select count(*) from stocks_orcfile;比较一下上述五个查询所需要的时间

文件存储格式是真正的压缩吗? 每一种文件文件格式有一定的压缩比例,但是不是真正的压缩,而是文件格式带来的。gson等{"uname":"zs","score":{"math":[100,98,76],"chinese":[98,96,100],"english":[100,99,90]}} {"uname":"ls","score":{"math":[60,80,70],"chinese":[90,66,91],"english":[50,51,70]}}建表:create table if not exists complex(uname string,score map<string,array<int>>)row format serde 'org.openx.data.jsonserde.JsonSerDe'stored as textfile;加载数据并查看是否正常解析:load data local inpath '/home/hivedata/json2.txt' into table complex;select * from complex;

add jar /opt/modules/json-serde-1.3.8-jar-with-dependencies.jar;一般将jar包上传至hdfs上,并且把这个语句添加到  .hiverc文件中add jar hdfs://bigdata01:9820/lib/json-serde-1.3.8-jar-with-dependencies.jar;

缺少jar包:为什么以前添加过了现在还要添加,原因是hive客户端关闭又开启,就需要重新添加

以上做法还可以这样做:

在 hive-site.xml 中指定 lib 的路径:

<property>    <name>hive.aux.jars.path</name>    <value>/opt/installs/hive/lib/</value>  </property>

重启一下 metastore 和 hiveserver2 服务,此时一切正常。Hive使用SerDe(和FileFormat)来读/写表的Row对象。

4)压缩编码器

5)实战一下

-- 开启中间压缩机制hive > set hive.exec.compress.intermediate=true;-- 设置中间压缩编码器hive > set hive.intermediate.compression.codec=org.apache.hadoop.io.compress.DefaultCodec;-- 设置压缩类型hive > set hive.intermediate.compression.type=RECORD;-- 开启reduce端的压缩机制hive > set hive.exec.compress.output=true;-- 创建表create external table if not exists stocks_seq_2 (track_time string,url string,session_id string,referer string,ip string,end_user_id string,city_id string)row format delimitedfields terminated by ','stored as sequencefile;--动态加载数据:insert into stocks_seq_2 select * from stocks_1;

使用压缩后:16.71M

使用压缩前:19.37M

压缩工具如何判断好坏? 压缩比例高,解压速度快!

五、序列化与反列化

在哪里听过这个词?--> 只要碰见将对象存入内存、大概是 show index.... 错误

arry_contains()作用:判断数组是否包含某元素

语法:array_contains(数组,值),返回布尔类型

第五题:有如下数据,表示1、