在进行HIVE数据开发时,经常会遇到数据的导入导出的场景,归纳主要有以下几个需求:
1、HIVE数据的导出
- HIVE数据导出到本地
有时候需要把HIVE中数据导出到本地,以实现数据的转移,数据的分析等应用,这时候就需要把整个表或者某个查询的结果以文件的形式落地到本地文件目录下。(每次导入的时候都会把该目录下的所有文件、目录全部删除)
- 使用HIVE的Insert进行数据导出
insert overwrite local directory ‘/home/ipm/pingh/’
row format delimited fields terminated by ‘,’
select id from table;
需要注意的是:
* overwrite 是必须要有的,不然会报错,另外,如果导出的文件目录不存在会自动创建,生成的数据文件个数是reducer的个数决定的。
* 列分隔符语句不是必须的,如果不指定,则使用的是创建表的时候指定的列分隔符
2. 使用hdfs的命令-get把数据落地
hive是建立在hdfs之上的,数据存储在hdfs上,并且hive中的数据表(不包括元数据,元数据存储在MySQL上)是以文件形式存放的,一个表一个目录,所以就可以通过 hdfs fs -get 命令来实现HIVE表的导出,需要注意的是,这个只能导出整个文件或目录,并且如果目录或文件存在会报错
hdfs dfs -get 集群的数据目录或文件 本地的数据目录
- HIVE数据导出到关系数据库
- 使用sqoop的export命令导出数据到数据库
sqoop export –connect ‘jdbc:sqlserver://数据库(IP);username=;password=;database=’
–table 表名称
–export-dir ‘集群的目录’
–input-fileds-terminated-by ‘\001’这个是HIVE表数据的列分隔符
–input-null-string ‘\\N’
–input-null-non-string ‘\\N’
–m 5 表示最大的导入并行度
2、HIVE数据的导入
- 本地文件导入到HIVE
1、把本地的文件加载到Hive表中
hive 面向的是块处理,所以数据的加载都是大批量的导入,需要注意的是,导入文件的格式需要和表结构中列分隔符一致,不然会解析失败,都变成一列了
load data local inpath ‘/home/ipm/pingh/cnm.txt’
overwrite into table m
partition()
2、把集群的数据加载到HIVE中
load data overwrite inpath ”
into table m
partition()
- 数据库数据导入到HIVE
使用sqoop的import命令来加载数据到HIVE表中,需要注意的是,导入的时候HIVE中可以存在也可以不存在这个表,没有就自动创建,可以用–hive-table这个参数来处理
导入表名和源表不同名字的情况,数据导入是增量导入的
sqoop import
–connect ‘jdbc:sqlserver://数据库(IP);username=;password=;database=’
–table 表名称
–hive-table 表名称
–hive-import
–m 1
—
sqoop import –connect ‘jdbc:sqlserver://10.209.240.162 ;username=sa;password=!!Hn@nsn123;database=jzxn_dw’ –table D_TERMINAL_INFO –hive-table D_TERMINAL_INFO_IN –hive-import –m 1
———————————————–
create table D_USER_LIST (c1 string,c2 string,c3 string)
row format delimited fields terminated by ‘,’