一、Hive数据导入
1.从本地导入到服务器
--打开SFTP--
lcd c:\users\cielo\desktop --文件的本地目录
cd /data/temp --文件需要上传到的服务器目录
put xxx.txt --需要上传的文件名
2.从服务器上传到hive
--在hive环境下运行以下hql
load data [local] inpath '<文件路径>' [overwrite] into table <表名> [partition(partcol1=vall,partcol2=val2 …)];
--例如
load data local inpath '/data/temp/xxx.txt' overwrite into table1 partition(day_id = 20230808);
- 当带有 local 关键字时,文件路径指向服务器,即直接将服务器下的文件上传到hive,此时执行的是 copy 操作,不会删除服务器目录下的文件。
- 不带 local 关键字时,文件路径指向 hdfs ,需要先将文件从服务器上传到 hdfs,再从 hdfs 加载到 hive 中,此时执行的是 move 操作,会删除 hdfs 目录下的文件。把文件从服务器上传到 hdfs 的操作如下:
hdfs dfs -put <文件服务器路径> <文件hdfs路径> ##例如 hdfs dfs -put /data/temp/xxx.txt /user/tempdata/xxx.txt
- partition 关键字针对存在分区的表,当带有 overwrite 关键字时,目标表或分区中的原始数据会被删除,插入当前的新数据;不带 overwrite 关键字时,数据会以追加的方式被添加到表或分区中。
- 若上传的文件路径下已经存在同名文件,则原本的同名文件会被新上传的同名文件替换。
二、Hive数据导出
1.从hive导出到服务器
从hive导出数据到服务器有多种方法。
1.1 insert
--在hive环境下运行以下hql
insert [overwrite] [local] directory '<文件路径>' [row format delimited terminated fields by '/'] <sql语句>;
--例如
insert overwrite local directory '/data/temp' row format delimited terminated fields by ',' select * from table1;
- 当带有 local 关键字时,文件路径指向服务器,即直接将hive上的数据导出到服务器目录下。
- 不带 local 关键字时,文件路径指向 hdfs ,hive上的数据导出到了 hdfs 目录下,需要再从 hdfs 导出到服务器中。把数据从 hdfs 导出到服务器的操作如下:
hdfs dfs -get <文件hdfs路径> <文件服务器路径>; ##例如 hdfs dfs -get /user/tempdata/xxx.txt /data/temp/xxx.txt
1.2 hadoop 命令
hadoop fs -copyToLocal <hdfs文件路径> <服务器文件路径>
##例如
hadoop fs -copyToLocal /user/hive/warehouse/temp.db/table1 /data/temp
使用hadoop命令将数据导出到服务器,需要知道hive表的存储路径,可以在hive环境下运行以下hql:
show create table <表名>;
1.3 hive shell 命令
hive -e 'set hive.cli.print.header = true;select * from table' >> /data/temp table.csv
hive -e 是Linux下的hive表数据导出命令,可以在不进入hive交互窗口的情况下执行sql语句,通过 '>>' 可以将数据导出到服务器上的指定目录下,并存储为csv、xlsx、txt和log等格式的文件。
set hive.cli.print.header = true 是hive中打印表头的SQL语句,默认为false,打印出来是 <表名>.<字段名> 的格式。如果只想打印字段名,还需要加上以下命令:
set hive.resultset.use.unique.column.names=false;
hive -f /data/temp table.sql >> /data/temp table.csv
当数据导出语句过于复杂时,可以将SQL语句写进一个sql、hql、txt和log等后缀的文件,然后用 hive -f 进行数据导出。
2.从服务器导出到本地
--打开SFTP
cd /data/temp --hive上导出的文件的服务器目录
lcd c:\users\cielo\desktop --想要导出到的本地目录
get -r table.csv --要导出的文件名