Hive编程指南:数据操作

-- 创建数据库
create database if not exists dmt

-- 进入数据库

use inv_test

-- 创建表
drop table if exists dmt.user_inv_info_mon;
create table if not exists dmt.user_inv_info_mon (
user_id string,
inv_time string,
prod_id string,
inv_amt int
)row format delimited
fields terminated by ','--csv文件以逗号分隔
lines terminated by '\n' --行间隔‘\n’ 换行
tblproperties("skip.header.line.count"="1") --跳过文件行首1行
;

/*
建表的时候,若inv_time设置date类型,则导入完成后会显示成空

*/

-- 装载数据
load data local inpath '/Users/lg/Useful/hive_data/inv_test_data.csv' into table dmt.user_inv_info_mon;

-- load data local inpath '/Users/lg/Useful/hive_data/inv_test_data.csv' overwrite into table dmt.user_inv_info_mon;

/*
1、使用了local关键字 则表示从本地文件系统路径加载数据,否则是分布式文件系统中即hdfs
2、可以添加关键字 overwrite 覆盖原来的数据
3、

*/

-- 查看数据
select * from dmt.user_inv_info_mon limit 100;

-- 创建分区表

drop table if exists dmt.user_inv_par_info_mon;
create table if not exists dmt.user_inv_par_info_mon (
user_id string,
inv_time string,
prod_id string,
inv_amt int
)partitioned by (region string)
row format delimited
fields terminated by ','--csv文件以逗号分隔
lines terminated by '\n' --行间隔‘\n’ 换行
tblproperties("skip.header.line.count"="1") --跳过文件行首1行

;

load data local inpath '/Users/lg/Useful/hive_data/inv_test_data.csv' into table dmt.user_inv_par_info_mon partition (region='shanghai');

查看数据

select * from dmt.user_inv_par_info_mon;

hdfs命令查看文件位置

hdfs dfs -ls /data/hive/warehouse/

添加分区

alter table dmt.user_inv_par_info_mon add if not exists partition(region='beijing') location 'hdfs:/data/hive/warehouse/inv_test.db/region=beijing';

-- 通过查询语句想表中插入数据

insert into table dmt.user_inv_par_info_mon
partition(region='beijing')
select * from dmt.user_inv_info_mon

insert into 会以追加的方式插入数据,而insert overwrite会覆盖

插入数据到多个分区,若没有该分区则会新建

/*
从dmt.user_inv_info_mon表中读取的每条记录都会经过 select where 句子进行判断,这些句子都是独立进行判断的,并非if then else结构,按照该结构会写入指定的分区中
*/
from dmt.user_inv_info_mon a
insert into table dmt.user_inv_par_info_mon
partition(region='guangdong')
select * where a.user_id='a019'
insert overwrite table dmt.user_inv_par_info_mon
partition(region='anhui')
select * where a.inv_time='2020/1/1'

动态分区插入

hive 根据select 语句中最后一列来确定分区字段的值,也可以

insert overwrite table dmt.user_inv_par_info_mon
partition(region)
select ..,a.region_name
from dmt.user_inv_info_mon a

动态分区属性

hive.exec.dynamic.partition 默认为false 设置成true,表示开启动态分区功能
hive.exec.dynamic.partition.mode 默认strict,该模式下,要求至少有一列分区字段是静态的

单个查询语句中创建表并加载数据

-- 使用该功能的常见场景是:从一个大的宽表中选取部分需要的数据集

create table dmt.user_inv_info_shanghai_mon as
select * from dmt.user_inv_par_info_mon where region='shanghai'

数据导出

1、如果数据文件恰好是用户需要的格式,那么只需要简单的拷贝文件就可以
hadoop fs -cp source_path target_path

否则,可以使用insert directory

insert overwrite local directory '/Useful/lg/Useful/hive_data/download'
select *
from dmt.user_inv_par_info_mon

你可能感兴趣的:(Hive编程指南:数据操作)