Hive数据导入导出

小鱼儿 2023-10-13 11:12 125阅读 0赞

1893ab50aff61acfd26ed2a4903cf010.jpeg

数据导入

  1. [root@qianfeng01 hive]# mkdir /hivedata
  2. [root@qianfeng01 hive]# cd /hivedata
  3. [root@qianfeng01 hive]# vi user.txt
  4. -- 加入下面的数据
  5. 1,廉德枫
  6. 2,刘浩
  7. 3,王鑫
  8. 4,司翔
  9. -- hive中创建一张表准备加载数据
  10. create table t_user2(
  11. id int,
  12. name string
  13. )
  14. row format delimited
  15. fields terminated by ','
  16. lines terminated by '\n'
  17. stored as textfile;

加载数据到Hive,一般分为两种:

  • 一种是从本地Linux上加载到Hive中
  • 另外一种是从HDFS加载到Hive中

方法1:使用hdfs dfs -put将本地文件上传到hive表目录下

  1. hdfs dfs -put ./user.txt /user/hive/warehouse/zoo.db/t_user2

方法2:在hive中使用load 命令

  1. load data [local] inpath '文件路径' [overwrite] into table 表名
  2. hive> load data local inpath '/root/hivedata/user.txt' into table t_user2;
  3. 加载数据时:
  4. 1. 最好是写'绝对路径',从根开始写。
  5. 2. 写相对路径也是可以的,但是'一定要记住你登录hive时的位置',写相对路径是从ive当前登录的位置写相对路径
  6. 3. ~在hive中,是相对路径的写法
  7. 例如:启动路径是/root
  8. 在提供相对路径的时候 ~/hivedata/user.txt --》 ~就相当于/root
  9. 4. 使用benline工具进行远程登录(客户端与服务端不在同一台机器)时,使用以下语句时:
  10. load data local inpath '文件路径' [overwrite] into table 表名
  11. 会有一个大坑:local是指服务端的文件系统。[benline就是客户端他使用的主机的文件系统]
  12. 5.overwrite 添加就是覆盖数据写入 不添加就是追加数据写入

扩展:hive可以加载的默认文件格式信息

9b15624f74f6e1e578a1ea507c16b779.png

WeChat9f2f42ee8a97608d13a9a4c388b6d985

方法3:从另外一张表(也可称之为备份表)中动态加载数据

  1. -- 语法 tableName1中所有select后面列数据插入到tableName2
  2. insert into table tableName2 select 表中的列(可以是多个)from tableName1
  3. 例如:
  4. create table u2(
  5. id int,
  6. name string
  7. )
  8. row format delimited fields terminated by ',';
  9. insert into table u2 select id,name from t_user2;
  10. -- 语法 向多张表中插入数据语法
  11. from tableName1(数据源表)
  12. insert into tableName2(插入数据的表)select *或列 [where 条件]
  13. insert into tableName3(插入数据的表)select *或列 [where 条件]
  14. ...
  15. create table u3(
  16. id int,
  17. name string
  18. )
  19. row format delimited fields terminated by ',';
  20. create table u4(
  21. id int,
  22. name string
  23. )
  24. row format delimited fields terminated by ',';
  25. from u2
  26. insert into u3 select *
  27. insert into u4 select id,name;

注意: tableName2表中的字段个数必须和tableName1表中查询出来的个数相同

上述的这个操作会启动MR进行操作

方法4:克隆表数据

  1. - create table if not exists tableName2 as select from tableName1;
  2. - create table if not exists tableName2 like tableName1 location 'tableName1的存储目录的路径' # 新表不会产生自己的表目录,因为用的是别的表的路径 -- 它不执行MR操作
  3. 扩展内容:只复制表结构
  4. create table if not exists tableName2 like tableName1;

注意:上述的这个操作会启动MR进行操作

加载数据的本质

  1. 如果数据在本地,加载数据的本质就是将数据copy到hdfs上的表目录下。
  2. 如果数据在hdfs上,加载数据的本质是将数据移动到hdfs的表目录下。

注意:hive使用的是严格的读时模式:加载数据时不检查数据的完整性,读时发现数据不对则使用NULL来代替。而mysql使用的是写时模式:在写入数据时就进行检查

数据导出

hive数据导出分类
  1. 从hive表中导出本地文件系统中(目录、文件)
  2. 从hive表中导出hdfs文件系统中
  3. hive表中导出到其它hive表中 (之前在导入数据的时候使用动态加载数据)
导出到目录下
  1. -- 1.导出数据到本地文件系统目录下
  2. insert overwrite local directory '本地系统文件导入路径' 获取表中数据语句操作(查询语句)
  3. hive> insert overwrite local directory '/root/out/00' select * from t_user2;
  4. -- 2.导出数据到HDFS文件系统目录下
  5. insert overwrite directory 'HDFS系统文件导入路径' 获取表中数据语句操作(查询语句)
  6. hive> insert overwrite directory '/root/out/00' select * from t_user2;
  7. -- 上述导出数据的操作,数据之间是不存在分隔
  8. --3.导出数据到“本地文件系统”或“HDFS”中可以指定导出数据的分隔符号
  9. insert overwrite [local] directory '本地或HDFS文件系统文件导入路径'
  10. row format delimited fields terminated by '指定数据分隔符号'
  11. 获取表中数据语句操作(查询语句)
直接导入到本地文件系统的文件中

ps:这种方式使用外部hive命了进行数据导出操作

  1. -- 语法:
  2. hive -e '提供查询语句获取数据(提供表的时候要使用 数据库名.表名)' >> 本地文件系统路径(路径上最后一个名字时输出文件的名字,不是文件夹的名字)
  3. [root@qianfeng01 ~]# hive -e 'select * from zoo.t_user2' >> /root/out/01
  4. -- 导出的数据默认会使用\t做数据分隔

更多大数据精彩内容欢迎B站搜索“千锋教育”或者扫码领取全套资料

【千锋教育】大数据开发全套教程,史上最全面的大数据学习视频

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读