hive存储parquet表

parquet格式的表在生产环境中经常被使用到,具有列式存储和压缩等特点,我们怎么在hive中存储parquet格式的表呢。

使用数据

这里使用oracle的emp表

7369,smith,clerk,7902,2010-12-17,800,,20
7499,allen,salesman,7698,2011-02-20,1600,300,30
7521,ward,salesman,7698,2011-02-22,1250,500,30
7566,jones,manager,7839,2011-04-02,2975,,20
7654,martin,salesman,7698,2011-09-28,1250,1400,30
7698,blake,manager,7839,2011-05-01,2850,,30
7782,clark,manager,7839,2011-06-09,2450,,10
7788,scott,analyst,7566,2017-07-13,3000,,20
7839,king,president,,2011-11-07,5000,,10
7844,turner,salesman,7698,2011-09-08,1500,0,30
7876,adams,clerk,7788,2017-07-13,1100,,20
7900,james,clerk,7698,2011-12-03,950,,30
7902,ford,analyst,7566,2011-12-03,3000,,20
7934,miller,clerk,7782,2012-01-23,1300,,10
创建parquet格式的表
CREATE TABLE emp (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)row format delimited fields terminated by ","
stored as PARQUET;

加载本地数据到hive表

load data local inpath '/home/zhou/data/emp.txt' into table emp;

执行查询

select *  from emp;

发现报错


原因

emp使用parquet格式存储,其中imputFormat和outputFormat都是parquet的相关的,也就是我的imputFormat是parquent的,但是你传过来的是text,我不认识
我们看一下emp的相关信息,可以看到这里的都是parquet的format的,这是导致这次错误的原因。

desc formatted emp;
image.png

这就导致了我们需要每次都先把text文件转化为parquet的文件,然后parquent表进行加载才可以,下面介绍官方推荐的使用方法。

创建emp的临时表 emp_tmp,存储格式为普通的文本格式
CREATE TABLE emp_tmp (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)row format delimited fields terminated by ",";

查看emp_tmp的表的信息,这里可以看到,默认的是TextImputFormat和TextOutputFormat的。

desc formatted emp_tmp;
image.png

然后加载数据到emp_tmp,查看数据,是正常显示的

load data local inpath '/home/zhou/data/emp.txt' into table emp_tmp;

然后现在把之前的emp里面的数据给删除

truncate table emp;

然后把emp_tmp表里面的数据加载到emp

insert into table emp select *  from emp_tmp;

查询一下,数据正常显示,这个方式使用起来还行,就是每次都需要对临时表进行操作,还是比较麻烦的。

Hive Parquet格式建表方式

感觉这个问题是经常出现,为什么会这样呢。这个和hive的版本有一定的关系。

hvie0.10-0.12
CREATE TABLE parquet_test (
 id int,
 str string,
 mp MAP<STRING,STRING>,
 lst ARRAY<STRING>,
 strct STRUCT<A:STRING,B:STRING>) 
PARTITIONED BY (part string)
ROW FORMAT SERDE 'parquet.hive.serde.ParquetHiveSerDe'
 STORED AS
 INPUTFORMAT 'parquet.hive.DeprecatedParquetInputFormat'
 OUTPUTFORMAT 'parquet.hive.DeprecatedParquetOutputFormat';
hvie0.13及之后的版本
CREATE TABLE parquet_test (
 id int,
 str string,
 mp MAP<STRING,STRING>,
 lst ARRAY<STRING>,
 strct STRUCT<A:STRING,B:STRING>) 
PARTITIONED BY (part string)
STORED AS PARQUET;

可以看出hive官方将inputformat和outputformat进行了整合,这样使用起来也是比较方便的。
但是可能有人想,那我修改inputformat不就行了,下面我介绍一下,看是否可以

修改inputformat,来实现直接加载text文件到parquet表

创建emp2表,是parquet的存储格式的

CREATE TABLE emp2 (
empno int,
ename string,
job string,
mgr int,
hiredate DATE,
sal int,
comm int,
deptno int
)row format delimited fields terminated by ","
stored as PARQUET;

修改inputformat 和serde,这里inputFormat是TextInputFormat,SEDE使用的是LazySimpleSerDe,Outputformat任然是Parquet的,这里需要带上。

alter table emp2 SET FILEFORMAT INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' 
SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

查看emp2表的信息,如下图表示修改成功

desc formatted emp2;

加载数据到emp2

load data local inpath '/home/zhou/data/emp.txt' into table emp2;

查询数据,执行成功

select *  from emp2;

到这里,修改inputformat和serde的方法也介绍完成了,我们以为成功了,但是上hdfs上一看,文件还是txt格式的,所以通过修改inputformat和serde的方法不行。


image.png
修改inputformat,serde保持为parquet

肯定有人想使用这个方法
这个方法我也尝试了,但是返回的值全都是null


综上

  在仅仅使用hive的时候,如果想把txt文件里面的数据保存到parquet表里面的话,可以使用建立临时表的方法,这个方法也是比较好操作的。
  但是其实如果使用spark,flink等分布式计算引擎的话,是可以直接的读取txt数据保存到parquet表里面的,框架帮我们做了转化。这种方式也是我们在工作中经常使用的。
  上面也介绍了修改inputformat和ser的方式,秀给inputformat是可以让txt文件里面的数据被读进来的,如果同时还修改了serde为lazysimpleserde的话,这个是把数据保存为text格式的,已经完全和parquet没有关系了,保存的文件还是txt格式的。仅修改inputformat,但是使用的serde是parquet的,但是数据进出不一致,也是有问题的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352