2019.04.25更新,新增数据类型转换部分
一.装载数据
--可自动创建分区
load data [local] inpath 'file_path' [overwrite] into table table_name [partition(partcol1=val1,parcol2=val2...)]
使用local关键字,那么'file_path'应该为本地文件系统(hive客户端所在系统,如Linux)路径,是复制本地数据到HDFS上的目标位置;如果不使用该关键字,这个路径应为HDFS中的文件路径(HDFS文件系统中),是把本身就在HDFS上的数据剪切至目标位置-此时建议使用绝对路径(源文件、目标文件以及目录应该在同一个文件系统中)
hive不会验证装载的数据格式和表定义的格式是否匹配(行列分隔符,以及array、struct等数据类型的分隔符等,即不做数据转换),但会验证文件格式是否和表结构定义的一致性(例表创建时定义存储格式为sequencefile,那么装载进入的文件也应该是这种格式)
filepath可以是以下三种类型(建议使用绝对路径):
1.相对路径 project/data
2.绝对路径 /user/hiveproject/data
3.包含模式的完整URL hdfs://namenode:8020/user/hiveproject/data
filepath可以引用一个文件或者一个目录
insert [overwrite|into] table table_name [partition(partcol1=val1,parcol2=val2...)] select ... from table_name1; --查询语句装载数据
--一次查询产生多个不相交的输出
from source
insert [overwrite|into] table table_name [partition (part='a')]
select id,name where id>=0 and id<100
insert [overwrite|into] table table_name_1 [partition (part='b')]
select id,name where id>=100 and id<200
二.导出数据
两种导出方式:导出至本地或者导出至HDFS,\n为默认换行符
insert [overwrite] [local] directory '/home/hadoop/r' [row format delimited fields terminated by ','] select * from test
--当hive表中的数据正好满足用户需要的数据格式,可直接复制文件或目录
hadoop fs -cp /user/hive/warehourss/source_table /user/hadoop
三.数据类型转换
Hive同Java一样包括隐式转换(implicit)和显式转换(explicitly)。Hive在需要时会对numeric类型进行隐式转换。比如对两个不同类型的数字进行比较,一个数据类型INT另一个SMALLINT类型,则SMALLINT隐式转换为INT,但不能隐式将INT转换成SMALLINT或TINYINT,除非用CAST函数。任何整数类型都可隐转换成范围更大类型。TINYINT,SMALLINT,INT,BIGINT,FLOAT和STRING都可隐转换成DOUBLE。STRING也可隐转换成DOUBLE但BOOLEAN类型不能转换为其他任何数据类型
可用CAST函数显式将一个类型数据转换成另一个数据类型
cast(value AS TYPE) #如果不能转换则输出NULL
注意事项:
1.浮点型转int类型是通过round()或floor()而不是cast()
2.BINARY类型只能转换成STRING类型。若确定BINARY类型是数字类型,cast(cast(a as string) as double)。也可将string类型转换成BINARY类型
3.Date类型只能在Date、Timestamp及string间转换
--返回date类型
cast(date as date)
--timestamp中年/月/日的值依赖于当地时区,结果返回date类型
cast(timestamp as date)
--若string为YYYY-MM-DD格式则相应年/月/日date类型数据将会返回,但如果string不是YYYY-MM-DD格式的,结果则会返回NULL
cast(string as date)
--基于当地时区生成对应date年/月/日的时间戳值
cast(date as timestamp)
--date所代表的年/月/日时间将转换成YYYY-MM-DD字符串
cast(date as string)