hive之核心知识点

hive之核心知识点,第1张

hive的语法和sql语法大部分是是相同的,下面我们来挨个写出来:

1,简单介绍存储原理:

hive和hdfs交互,以及和本地linux交互,分为本地文件和hdfs文件,要说他们的区别,底层都是存在磁盘上,要说区别的话,hdfs分布式文件管理系统,有它独有的文件存储结构也即是能够和分布式文件进行交互的独有存储方式,Linux本地文件存储知识单纯的在Linux *** 作系统存储的文件,所以hive的作用就是和linux本地以及linux上hdfs文件两者进行交互,我可以把本地的文件上传到hive文件中,当然hive只是处理hdfs上文件的一个工具,但是hive也有自己独有的文件存储,表的结构信息,创建的表信息,都在hive文件夹中当然是存储在hdfs上的。

2,语法:

1,把本地的文件加载到hive创建的表中(比如:create table tb_user(id int ,name string ); )在hive中创建的是有结构的表,然后通过命令:load data local inpath ' 路径 ' into table 创建的表名;

2,加载hdfs上的文件到hive中:load data inpath 'hdfs上的路径' into table 创建的表

3,导出hive表到hdfs上:export table 表名 to 'hdfs路径' ;

4,把hdfs上的表导入到hive表中:import table (hive表 )from (hdfs上的表);(import table tb_kk from '/data/a')当导入的表不存在会自动创建这张表,用于备份,或者数据转移,表的字段名和导入的字段名一样。

5,通过查询hive表中的数据并把查询的数据导出到本地:insert overwrite local directory '本地路径' select from student;

6通过查询hive表中的数据并把查询的数据导出到hdfs上:insert overwrite directory 'hdfs上的路径'

select from student;

7, 把查询的结果插入到 当前的hive表中 : insert overwrite table student partition(month='201708') select id, name from student where month='201709';

8,创建表并加载查询到的数据:create table if not exists tb_text as select from tb_text;(as 关键字 同样)

9,创建表时通过Location指定加载数据路径:create table tb_text (id int , name string ) row format delimited fields terminated by ‘,’ location '/hdfs上的目录',(记住是目录)。

10,创建分区表,分区表就是能够把不同的数据分开来存放,在查询的时候只需要查询指定的分区就行,这样子能够加快查询效率:create table tb_text (id int ,name string ) partitioned by (month string) (//这里我用month来作为分区条件,分区字段不能是表中已经存在的字段,可以将分区字段看成表的伪列,不参与真实字段的 ) row format delimited fields terminated by ',' ;看一下加载数据到分区表的列子,更好地理解一下,load data local inpath '/opt/module/datas/depttxt' into table defaultdept_partition partition(month='201709');//最后就是给伪列字段赋予分区值,也就是分区的文件名。

11,查看表结构,这个需要了解清楚:desc tb_text 查看基本表信息,desc formatted tb_text ,查看详细信息。

12,当数据库存在数据强制删除时可以用:drop database db_hive cascade;

13,当数据库不存在数据:drop database db_hive;

14,默认创建的表为管理表,也称之为内部表,数据和表结构是在一起的,也就是说,当我删除表的时候,底层数据也会跟着一起删除,设计成这样要求一张表代表一份数据,保证数据的安全性。

15,外部表为只存储表的元数据和结构信息,存储的是表的路径,删除外部表不会删除内部数据,只会把表的元数据信息删除了,不影响数据本身,通常用作共享数据,设计外部表的语法为:create external table tb_text(id int ,name string);

16,创建表的时候复制表结构:create table tb_text like tb_text01;

3,外部表和内部表的转化:

1,修改内部表为外部表:alter table tb_text set tblproperties('EXTERNAL'='TRUE');

2,修改外部表为内部表:alter table tb_text set tblproperties('EXTERNAL'='FALSE'); -- 要求KV的大小写,('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!

一次比较复杂的从Hive复杂格式字段解析出多个hotelid的过程

1    所需数据信息在value字段中,value字段是json格式,首先要提取出该字段中的htllist信息

get_json_object(value,'$htllist')

2 get_json_object的返回值是string格式,具体信息如下

字符串前后有'['和']',每个{}内是单个酒店的信息,{}之前以','分隔

4为了之后把每个{}分隔出来,需要先将','分隔符替换成'|'分隔符,并且将'[]'替换成‘’

regexp_replace(regexp_replace(get_json_object(value,'$htllist'),'},','}\\|'),'\\]|\\[','')

5将上一步得到的字符串按照'|'分隔,得到每个酒店信息的数组

lateral view explode(split(mhtllist,'\\|')) n as htlinfo

6str_to_map函数将酒店信息数组的每个元素转换成map格式,取其中的['hotelid']信息

str_to_map(regexp_replace(nhtlinfo,'\\}|\\{|"',''),',',':')['hotelid']

7完整的提取sql如下

select str_to_map(regexp_replace(nhtlinfo,'\\}|\\{|"',''),',',':')['hotelid'] htlinfo,mvid,msid,mpvid,muid,mcid

  from (select regexp_replace(regexp_replace(get_json_object(value,'$htllist'),'},','}\\|'),'\\]|\\[','') htllist,vid,sid,pvid,uid,cid

          from table_xxx

        where d='2018-08-08'

          and pagecode='condition1'

          and key ='condition2' limit 100)m

  lateral view explode(split(mhtllist,'\\|')) n as htlinfo

where mhtllist is not null

基本语法:

例:将表table_change_new中的字段name移到addr字段后面name和addr都是string类型

注:移动列位置的坑
上面的这种位置转移涉及到类型强制转换问题,
比如int不能被转换成string
尝试将sex字段int类型移动到addr后面,addr后面现在是name字段string类型

报当前列sex类型和现有位置的列name不相容的错误

例:将name放到第一列,现在name在第二列

例:创建表city,字段分隔符为#

将一份以tab作为字段分隔符的数据导入city,数据都被作为第一个字段的值

将字段分隔符改为tab

再次查看city表,每个字段值都被正常显示

例:创建分区表city,字段分隔符为#

将一份以tab作为字段分隔符的数据导入city,数据都被作为第一个字段的值, 分区表导入数据时要指定分区

查看此时的city表,数据都被赋给第一个字段

将字段分隔符改为tab

查看此时的字段分隔符参数, 发现还是#

修改分区表序列参数的坑:

注:如果修改serdeproperties参数的时候不加分区,那么字段分隔符参数fielddelim会被改为\t,但是还是没法把该分区的数据分隔开

分区等于20191010的数据可以正常显示
再导入新的数据,设分区等于20191110

发现新分区的数据无法按照分隔符tab显示
再导入新的数据,分区还是等于20191010

此时的数据还是无法显示
再导入新数据,设分区等于20191110

基本语法:

例:将内表city的location修改到/home/yy
此时/home/yy目录下有两个文件

此时city显示的/home/yy目录下的所有文件内容

内表转外表

外表转内表


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13409207.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-30
下一篇 2023-07-30

发表评论

登录后才能评论

评论列表(0条)

保存