-- 创建数据库
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