%hive
--insert into mydemo.xxx values(1,'zhangsan',25),(2,'wangwu',27)
select * from mydemo.xxx
2.创建1个压缩格式为orc的内部表
%hive
create table mydemo.yyy(
id string,
name string
row format delimited fields terminated by ','
stored as orc
3.向表中插入数据
%hive
create table mydemo.yyy(
id string,
name string
row format delimited fields terminated by ','
stored as orc
4.补充:
hive建表语法中的分隔符设定
ROW FORMAT DELIMITED 分隔符设置开始语句
FIELDS TERMINATED BY:设置字段与字段之间的分隔符
COLLECTION ITEMS TERMINATED BY:设置一个复杂类型(array,struct)字段的各个item之间的分隔符
MAP KEYS TERMINATED BY:设置一个复杂类型(Map)字段的key value之间的分隔符
LINES TERMINATED BY:设置行与行之间的分隔符
二、外部表
1.创建一个外部表
首先在Hadoop上创建一个数据目录,后面将数据文件上传到此,再创建外部表映射到这里
-- 在Hadoop上创建一个数据目录
hdfs dfs -mkdir /tab
-- 上传数据文件到外部表的文件夹
hdfs dfs -put /opt/data/data.txt /tab
-- 创建一个外部表,映射到Hadoop上的数据文件位置
%hive
create external table mydemo.uss(
id string,
name string,
job ARRAY<string>,
sex_age STRUCT<sex:int,age:string>, -- 对象类型
skill MAP<string,string>
)
row format delimited fields terminated by ' ' -- 列于列之间用空格隔开
collection items terminated by ',' -- 集合之间用,隔开
map keys terminated by ':' -- map的键值对之间用:隔开
location '/tab'
-- 查看数据表
%hive
select id,job[0],sex_age.age,skill['skill1'] from mydemo.uss
-- row format delimited fields terminated by ','
-- location '/tab1'
-- tblproperties('skip.header.line.count'='1') --去除首行
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
with serdeproperties
'separatorChar' = ',',
'quoteChar' = '\"',
'escapeChar' = '\\'
location '/tab1'
tblproperties('skip.header.line.count'='1')
三、根据已有的表创建新表,只能建内部表
%hive
--create table mydemo.usi1 as select * from mydemo.usi --连数据带结构
--create table mydemo.usi2 like mydemo.usi --只复制表结构
--创建表不推荐 但查询使用非常方便
create table mydemo.usi3 as
r1 as (select userid id,username name from mydemo.userinfos),
r2 as (select id,name from mydemo.usi)
select * from r1 union all select * from r2
四、使用load向表中传数据
分别创建一张内部表和一张外部表:
-- 内部表
%hive
-- drop table mydemo.test1
create table mydemo.test1(
id string,
name string
row format delimited fields terminated by ','
stored as textfile
-- 外部表
-- create external table mydemo.test2(
-- id string,
-- name string
-- row format delimited fields terminated by ','
-- location '/tab2'
2.用load加载hive中的数据 ---> ETL 数据格式不能转换
%hive
load data local inpath '/opt/data/dd.txt' into table mydemo.test1
-- local 是指从Linux本地加载 不加local就是指从Hadoop上加载
-- load data local inpath '/opt/data/dd.txt' overwrite into table mydemo.test2
-- overwrite是全量表(用一次覆盖一次)| 不写是增量表写法(往后面追加,前面已有数据不动)
五、创建分区表
分区表操作:实际上就是建立一个个的文件夹,将数据按照你的分区约定,分别存放进去。分为静态分区和动态分区
创建一个分区表,id,name,birthmonth三列,其中按birthmonth分区:
%hive
create table mydemo.my_part(
id string,
name string
partitioned by (birthmonth string) -- 分区的那个列写在外面
row format delimited fields terminated by ','
1.手工创建一个静态分区
%hive
alter table mydemo.my_part add partition(birthmonth='01') -- 实质上就是手工添加一个文件夹
此时去你的50070端口,你会发现在/hive/warehouse/mydemo.db/my_part路径下,为你生成好了一个 ‘
birthmonth=01’
文件夹
2.向指定分区里面插入Linux本地的数据文件进去(两种方法 : 静态 和 动态)
一:静态将数据以全量表(不覆盖)的方式插入
%hive
load data local inpath '/opt/data/dd.txt' overwrite into table mydemo.my_part partition(birthmonth='01')
二:动态插入一些数据
%hive
insert into mydemo.my_part partition(birthmonth='01') select id,name from mydemo.usi
3.再创建一个动态分区,并向其中插入数据
%hive
-- 动态分区是根据查询分区列的有几种变化就有几个分区(列值基数)
-- set hive.exec.dynamic.partition=true;
-- set hive.exec.dynamic.partition.mode=nonstrict;
-- 放入数据
insert into mydemo.my_part1 partition(birthmonth) select id,name,month(regexp_replace(birth,'/','-')) birthmonth from mydemo.usi
六、分桶表
1.先创建一个临时表
%hive
-- 创建一个临时表存放数据
-- create temporary table mydemo.tmp(
-- id string,
-- name string,
-- gender string
-- row format delimited fields terminated by ','
load data local inpath '/opt/data/ddd.csv' overwrite into table mydemo.tmp
2.创建分桶表
%hive
-- create table mydemo.bck_user(
-- id string,
-- name string,
-- gender string
-- clustered by (gender) -- 按照什么分桶
-- into 2 buckets -- 分多少个桶
-- row format delimited fields terminated by ','
-- set hive.enforce.bucketing=true
-- set mapreduce.job.reduces=2
insert into table mydemo.bck_user select * from mydemo.tmp
3.查看分桶表
%hive
select * from mydemo.tmp tablesample(bucket 2 out of 2 on gender)
-- (1)n = 总桶数 (2)x = 抽桶开始的位置 (3)y 2^z = 抽取总桶数的比例 n/y=2/2=1
七、创建视图
%hive
create view mydemo.view_user as
select id,name,if(gender='男',1,0) sex from mydemo.bck_user
%hive
select * from mydemo.view_user
map_values(字段) 当一个列是map类型,取出所有的value
array_contain(字段,
'
值
'
) 针对array类型的集合 判断该列中是否包含有‘值’
sort_array(字段) 针对array类型的集合 进行排序
cast( 字段
as
类型) 将某一字段类型强转为后面指定的类型
九、日期函数
%hive
-- 1.from_unixtime()将一个时间戳转为指定格式的日期
-- 2.unix_timestamp()获取当下时间戳--->"2021-09-23 16:05:47"规定格式
-- 3.如果不用这种格式返回值为null,此时要在后面给定格式
-- select from_unixtime(1632384347,'yyyy-MM-dd HH:mm:ss'),unix_timestamp(),unix_timestamp("2021-09-23 16:05:47"),unix_timestamp("2021-09-23","yyyy-MM-dd")
-- 1.to_date()将字符串中的日期部分提取出来,year将日期中的年份提取出来
-- 2.dayofmonth()一个月中的第几天,如果给定日期超出,自动跳到下个月
-- 3.datediff()计算两个日期差多少天(前-后)
-- 4.date_sub('xxxx',int days)给指定日期减去days天*-
-- 5.current_date()获取当前时间
-- 6.next_Day(给定日期,'星期几') 找到从给定日期起,下一个该星期几是几号
-- 7.date_format("给定日期","给定格式") 将给定日期按照给定格式转换
-- select to_date("2021-09-23 16:05:47"),year("2021-1-1"),dayofmonth("2021-5-23"),weekofyear("2021-4-19"),datediff('2021-5-6','2021-5-23'),date_sub('2021-5-19',1),current_date(),current_timestamp(),add_months(current_date(),6),last_day(current_date())
select next_day(current_date(),'WE'),date_format(current_date(),"yyyy-MM")
十、hive 的数学函数
%hive
-- round()函数,默认四舍五入,除非你在后面指定精确到小数点后几位。
select round(10.5),round(10.35468,3),floor(-10.2),ceil(10.9),rand(100)
select exp(2),ln(10),pow(2,3),sqrt(25)
十一、explode函数和posexplode函数
%hive
-- select * from mydemo.usi
-- 某一字段可能包含多个值,是个数组 explode函数将这些值全部拿出来 只拿值 注意必须起别名
-- select id,name,birth,ind from mydemo.usi lateral view explode(split(hoby,',')) b as ind
-- 在上面的基础上,将数组的下标和值对应着一一拿出 对应下标和值全部拿出来 注意必须起别名
select id,name,birth,ind,schem from mydemo.usi lateral view posexplode(split(hoby,',')) b as ind,schem
本文来自博客园,作者:{理想三旬},转载请注明原文链接:{https://www.cnblogs.com/zyp0519/}