• 【Python大数据笔记_day06_Hive】


    hive内外表操作

    建表语法

    create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... )
    [partitioned by (分区字段名 分区字段类型)] # 分区表固定格式
    [clustered by (分桶字段名)  into 桶个数 buckets]  # 分桶表固定格式 注意: 可以排序[sorted by (排序字段名 asc|desc)]
    [row format delimited fields terminated by '字段分隔符'] # 自定义字段分隔符固定格式
    [stored as textfile]  # 默认即可
    [location 'hdfs://域名:8020/user/hive/warehouse/库名.db/表名'] # 默认即可
    ; # 注意: 最后一定加分号结尾

    注意: 关键字顺序是从上到下从左到右,否则报错

    default默认库存储路径:  /user/hive/warehouse   
    自定义库在HDFS的默认存储路径:    /user/hive/warehouse/库名.db
    自定义表在HDFS的默认存储路径:    /user/hive/warehouse/库名.db/表名
    业务数据文件在HDFS的默认存储路径:    /user/hive/warehouse/库名.db/表名/数据文件

     数据类型

    基本数据类型:  整数: int  小数: float double  字符串: string varchar(长度)  日期: date timestamp

    复杂数据类型:  集合: array  映射: map   结构体: struct  联合体: union 

     表分类

    Hive中可以创建的表有好几种类型, 分别是:
    内部表:又叫管理表或者托管表
        分区表(分区分桶表)
        分桶表
    外部表:又叫非管理表或者非托管表
        分区表(分区分桶表)
        分桶表
        

    内部表和外部表区别?
    内部表: 未被external关键字修饰的即是内部表, 即普通表。 内部表又称管理表,还可以叫托管表
        删除内部表:直接删除元数据(metadata)和存储数据本身
    外部表: 被external关键字修饰的即是外部表, 即关联表。 还可以叫非管理表或非托管表
        删除外部表:仅仅是删除元数据(metadata),不会删除存储数据本身
        
    查看表格式化信息: desc formatted 表名; 
        -- 内部表类型: MANAGED_TABLE
        -- 外部表类型: EXTERNAL_TABLE

    1. -- 内部表(又叫管理表或者托管表)
    2. create table stu1(
    3. id int,
    4. name string
    5. );
    6. -- 外部表(又叫非管理表,非托管表)
    7. create external table stu2(
    8. id int,
    9. name string
    10. );
    11. -- 查看表结构
    12. desc stu1;
    13. desc stu2;
    14. -- 查看表格式化信息
    15. desc formatted stu1; -- 内部表类型: managed_table
    16. desc formatted stu2; -- 外部表类型: external_table
    17. -- 演示内外部表的重点区别
    18. -- 删除内部表(管理表/托管表),会删除表相关的所有数据
    19. insert into stu1 values(1,'张三');
    20. drop table stu1;
    21. -- 删除外部表,只删除了元数据,hdfs中业务数据保留
    22. insert into stu2 values(1,'张三');
    23. drop table stu2;
    24. -- 再次建表后,可以使用location重新关联原来hdfs保留的业务数据
    25. create external table stu22(
    26. id int,
    27. name string
    28. )location '/user/hive/warehouse/hive1.db/stu2';
    29. -- 验证数据
    30. select * from stu22 limit 10;

     内部表基本操作

    创建内部表: create table [if not exists] 内部表名(字段名 字段类型 , 字段名 字段类型 , ... )[row format delimited fields terminated by '字段分隔符'] ;

    复制内部表: 方式1: like方式复制表结构    方式2: as 方式复制表结构和数据

    删除内部表: drop table 内部表名;
        注意: 删除内部表效果是mysql中表相关元数据被删除,同时存储在hdfs中的业务数据本身也被删除

    查看表格式化信息: desc formatted 表名; -- 内部表类型: MANAGED_TABLE

    注意: 还可以使用truncate清空内部表数据    格式: truncate table 内部表名;

    1. -- 操作表的前提:先有库并使用它
    2. create database hive2;
    3. use hive2;
    4. -- 一.内部表的创建和删除
    5. -- 1.演示创建内部表
    6. -- 建表方式1
    7. create table inner_stu1(
    8. id int,
    9. name string
    10. );
    11. -- 插入数据
    12. insert into inner_stu1 values(1,'张三');
    13. -- 建表方式2: 复制表结构
    14. create table inner_stu2 like inner_stu1;
    15. -- 插入数据
    16. insert into inner_stu2 values(1,'张三');
    17. -- 建表方式3: 复制表结构和数据
    18. create table inner_stu3 as
    19. select * from inner_stu1;
    20. -- 2.演示查看内部表结构详细信息
    21. -- 内部表类型: MANAGED_TABLE
    22. desc formatted inner_stu1;
    23. desc formatted inner_stu2;
    24. desc formatted inner_stu3;
    25. -- 3.演示内部表的删除
    26. -- 删除内部表
    27. drop table inner_stu3;-- 元数据和业务数据均被删除
    28. -- 清空内部数据
    29. truncate table inner_stu2;
    30. -- 注意: delete和update不能使用
    31. delete from inner_stu1;-- 报错
    32. update inner_stu1 set name = '李四'; -- 报错

    外部表基本操作

     创建外部表: create external table [if not exists] 外部表名(字段名 字段类型 , 字段名 字段类型 , ... )[row format delimited fields terminated by '字段分隔符'] ;

    复制表: 方式1: like方式复制表结构    注意: as方式不可以使用

    删除外部表: drop table 外部表名;
        注意: 删除外部表效果是mysql中元数据被删除,但是存储在hdfs中的业务数据本身被保留
        
    查看表格式化信息: desc formatted 表名; -- 外部表类型: EXTERNAL_TABLE

    注意: 外部表不能使用truncate清空数据本身

    1. -- 二.外部表的创建和删除
    2. -- 1.外部的表创建
    3. -- 建表方式1
    4. create external table outer_stu1(
    5. id int,
    6. name string
    7. );
    8. -- 插入数据
    9. insert into outer_stu1 values(1,'张三');
    10. -- 建表方式2
    11. create external table outer_stu2 like outer_stu1;
    12. -- 插入数据
    13. insert into outer_stu2 values(1,'张三');
    14. -- 注意: 外部表不能使用create ... as 方式复制表
    15. create external table outer_stu3 as
    16. select * from outer_stu1; -- 报错
    17. -- 2.演示查看外部表结构详细信息
    18. -- 外部表类型: EXTERNAL_TABLE
    19. desc formatted outer_stu1;
    20. desc formatted outer_stu2;
    21. -- 3.演示外部表的删除
    22. -- 删除表
    23. drop table outer_stu2;
    24. -- 注意: 外部表不能使用truncate关键字清空数据
    25. truncate table outer_stu1; -- 报错
    26. -- 注意: delete和update不能使用
    27. delete from outer_stu1; -- 报错
    28. update outer_stu1 set name = '李四'; -- 报错

    查看/修改表

     查看所有表: show tables;
    查看建表语句: show create table 表名;
    查看表信息: desc 表名;
    查看表结构信息: desc 表名; 
    查看表格式化信息: desc formatted 表名;            注意: formatted能够展示详细信息

    修改表名: alter table 旧表名 rename to 新表名
    字段的添加: alter table 表名 add columns (字段名 字段类型);
    字段的替换: alter table 表名 replace columns (字段名 字段类型 , ...);
    字段名和字段类型同时修改: alter table 表名 change 旧字段名 新字段名 新字段类型;
        注意: 字符串类型不能直接改数值类型
        
    修改表路径: alter table 表名 set location 'hdfs中存储路径';             注意: 建议使用默认路径
    location:  建表的时候不写有默认路径/user/hive/warehouse/库名.db/表名,当然建表的时候也可以直接指定路径

    修改表属性: alter table 表名 set tblproperties ('属性名'='属性值');     注意: 经常用于内外部表切换
    内外部表类型切换:  外部表属性: 'EXTERNAL'='TRUE'   内部表属性: 'EXTERNAL'='FALSE'

    1. -- 三.表的查看/修改操作
    2. -- 验证之前的内外部表是否存在以及是否有数据,如果没有自己创建,如果有直接使用
    3. select * from inner_stu1 limit 1;
    4. select * from outer_stu1 limit 1;
    5. -- 1.表的查看操作
    6. -- 查看所有的表
    7. show tables;
    8. -- 查看建表语句
    9. show create table inner_stu1;
    10. show create table outer_stu1;
    11. -- 查看表基本机构
    12. desc inner_stu1;
    13. desc outer_stu1;
    14. -- 查看表格式化详细信息
    15. desc formatted inner_stu1;
    16. desc formatted outer_stu1;
    17. -- 2.表的修改操作
    18. -- 修改表名
    19. -- 注意: 外部表只会修改元数据表名,hdfs中表目录名不会改变
    20. alter table inner_stu1 rename to inner_stu;
    21. alter table outer_stu1 rename to outer_stu;
    22. -- 修改表中字段
    23. -- 添加字段
    24. alter table inner_stu add columns(age int);
    25. alter table outer_stu add columns(age int);
    26. -- 替换字段
    27. alter table inner_stu replace columns(id int,name string);
    28. alter table outer_stu replace columns(id int,name string);
    29. -- 修改字段
    30. alter table inner_stu change name sname varchar(100);
    31. alter table outer_stu change name sname varchar(100);
    32. -- 修改表路径(实际不建议修改)
    33. -- 注意: 修改完路径后,如果该路径不存在,不会立刻创建,以后插入数据的时候自动生成目录
    34. alter table inner_stu set location '/inner_stu';
    35. alter table outer_stu set location '/outer_stu';
    36. -- 修改表属性
    37. -- 先查看类型
    38. desc formatted inner_stu; -- MANAGED_TABLE
    39. desc formatted outer_stu; -- EXTERNAL_TABLE
    40. -- 内部表改为外部表
    41. alter table inner_stu set tblproperties ('EXTERNAL'='TRUE');
    42. -- 外部表改为内部表
    43. alter table outer_stu set tblproperties ('EXTERNAL'='FALSE');
    44. -- 最后再查看类型
    45. desc formatted inner_stu; -- EXTERNAL_TABLE
    46. desc formatted outer_stu; -- MANAGED_TABLE

     默认分隔符

    创建表的时候,如果不指定分隔符,以后表只能识别默认的分隔符,键盘不好打印,展示形式一般为:\0001,SOH,^A,□

    1. -- 默认分隔符: 创建表的时候不指定就代表使用默认分隔符
    2. -- 1.创建表
    3. create table stu(
    4. id int,
    5. name string
    6. );
    7. -- insert方式插入数据,会自动使用默认分隔符把数据连接起来
    8. -- 2.插入数据
    9. insert into stu values(1,'zhangsan');
    10. -- 3.验证数据
    11. select * from stu limit 1;
    12. -- 当然也可以通过在hdfs中查看,默认分隔符是\0001,其他工具中也会展示为SOH,^A,□

    快速映射表

     创建表的时候指定分隔符: create [external] table 表名(字段名 字段类型)row format delimited fields terminated by 符号;

    加载数据: load data [local] inpath '结构化数据文件' into table 表名;

    1. -- 创建表
    2. create table products(
    3. id int,
    4. name string,
    5. price double,
    6. cid string
    7. )row format delimited
    8. fields terminated by ',';
    9. -- 加载数据
    10. -- 注意: 如果从hdfs中加载文件,本质就是移动文件到对应表路径下
    11. load data inpath '/source/products.txt' into table products;
    12. -- 验证数据
    13. select * from products limit 1;

    数据导入和导出

    文件数据加载导入

    1.直接上传文件

    Windows页面上传

    需求: 已知emp1.txt文件在windows/mac系统,要求使用hdfs保存此文件 并且使用hivesql建表关联数据

    1. -- 1.先在hive上根据数据建表,然后在window/mac上传文件到hdfs表路径中
    2. create table emp1(
    3. id int,
    4. name string,
    5. sal double,
    6. dept string
    7. )row format delimited
    8. fields terminated by ',';
    9. -- windows使用hdfs页面上传文件
    10. -- node1:9870访问页面把emp1.txt上传到/user/hive/warehouse/hive02.db/emp1路径下
    11. -- 查询数据
    12. select * from emp1;
     Linux本地put上传

    需求: 已知emp2.txt文件在linux系统,要求使用hdfs保存此文件 并且使用hivesql建表关联数据

    1. -- 2.先在hive上根据数据建表,然后在linux上传文件到hdfs表路径中
    2. create table emp2(
    3. id int,
    4. name string,
    5. sal double,
    6. dept string
    7. )row format delimited
    8. fields terminated by ',';
    9. -- linux使用hdfs命令上传文件
    10. -- [root@node1 ~]# hdfs dfs -put emp2.txt /user/hive/warehouse/hive02.db/emp2
    11. -- 查看数据
    12. select * from emp2;

    2.load加载文件

     从hdfs路径把文件移动到表对应存储路径中: load data inpath 'HDFS文件路径' [overwrite] into table 表名;

    从linux本地把文件上传到表对应存储路径中: load data local inpath 'Linux文件路径' [overwrite] into table 表名;

     load移动HDFS文件
    1. -- 数据导入
    2. -- 需求1: load加载hdfs中文件到表路径中
    3. -- 1.根据资料中search_log.txt数据创建表
    4. create table search_log(
    5. dt string,
    6. uid string,
    7. name string,
    8. url string
    9. )row format delimited fields terminated by '\t';
    10. -- 2.把windows中search_log.txt文件上传hdfs其他路径,例如:/src中
    11. -- 3.使用load把hdfs的/src中的文件移动到search_log对应hdfs表存储路径中
    12. load data inpath '/src/search_log.txt' into table search_log;
    13. -- 4.查询数据
    14. select * from search_log;
    load上传Linux文件
    1. -- 需求2: 直接把linux中最新的search_log.txt文件上传到search表对应hdfs路径中
    2. -- 先把资料中search_log.txt文件传到linux中,例如:/root
    3. -- load命令上传文件
    4. load data local inpath '/root/search_log.txt' overwrite into table search_log;
    5. -- 查看最终数据
    6. select * from search_log;

    3.insert插入数据

    从其他表查询数据'追加'插入到当前表中: insert into [table] 表名 select 语句;

    从其他表查询数据'覆盖'插入到当前表中: insert overwrite table 表名 select 语句;

    insert追加数据
    1. -- 需求1:创建一个search_log_copy表,然后从search_log查询数据插入到新表中
    2. create table search_log_copy(
    3. dt string,
    4. uid string,
    5. word string,
    6. url string
    7. )row format delimited
    8. fields terminated by '\t';
    9. -- 从search_log表中查所有数据,直接插入到search_log_copy表
    10. insert into table search_log_copy select * from search_log;
    11. -- 查看数据
    12. select * from search_log_copy;
    insert覆盖数据
    1. -- 需求2: 假设search_log表中数据改变了,要求把最新的数据更新到search_log_copy表中
    2. insert overwrite table search_log_copy select * from search_log;
    3. -- 查看数据
    4. select * from search_log_copy;

    文件数据导出

    1.直接下载文件

    web页面下载

    需求: 已知search_log.txt文件在HFDS的/user/hive/warehouse/hive02.db/search_log路径下,要下载到window系统

     

     get命令下载文件

    需求: 已知search_log.txt文件在HFDS的/user/hive/warehouse/hive02.db/search_log路径下,要下载到linux系统

    [root@node1 binzi]# hdfs dfs -get /user/hive/warehouse/hive02.db/search_log/search_log.txt /binzi

    2.insert导出数据

    查询数据导出到hdfs其他路径: insert overwrite directory 'hfds存储该数据路径' select语句;

    查询数据导出到linux本地中: insert overwrite local directory 'linux存储该数据路径' select语句;

    注意:  overwrite默认是覆盖重写,所以在指定存储该数据路径的时候尽量指定一个空的目录

    注意: 导出数据的时候不指定分隔符采用默认分隔符SOH,0001,?...

    导出数据指定分隔符添加: row format delimited fields terminated by '分隔符'

     insert导出到hdfs
    1. -- 演示insert overwrite导出数据到文件
    2. -- 语法: insert overwrite [local] directory 文件存储路径 [指定分隔符] select语句;
    3. -- 导出数据到hfds
    4. -- 注意: 如果是根目录/,会自动创建-ext-10000目录存储生成的000000_0文件
    5. -- 但是其他目录,会自动清空所有内容,再生成一个000000_0文件,所以注意导出目录尽量是一个新的空目录
    6. -- 默认分隔符
    7. insert overwrite directory '/source' select * from search_log1;
    8. -- 指定分隔符
    9. insert overwrite directory '/output'
    10. row format delimited fields terminated by ','
    11. select * from search_log1;
    insert导出Linux
    1. -- 2.2导出到linux
    2. -- [root@node1 ~]# mkdir /output
    3. -- 导出到linux的/output目录下,自动生成000000_0文件存储查询结果
    4. -- 默认分隔符
    5. insert overwrite local directory '/output' select * from search_log1;
    6. -- 指定分隔符
    7. insert overwrite local directory '/output'
    8. row format delimited fields terminated by ','
    9. select * from search_log1;

    3.hive_shell命令

    hive命令执行sql语句:  hive -e "sql语句" > 存储该结果数据的文件路径

    hive命令执行sql脚本:  hive -f sql脚本文件 > 存储该结果数据的文件路径

     hql语句导出
    1. # 以下命令都是在linux的shell命令行执行
    2. # 3.1使用hive -e sql语句方式导出数据
    3. [root@node1 ~]# hive -e 'select * from hive02.search_log;' > /home/hs1.txt
    4. [root@node1 ~]# cat hs1.txt
    hql脚本导出
    1. # 3.2使用hive -f 脚本文件方式导出数据
    2. [root@node1 ~]# echo 'select * from hive02.search_log;' > /home/export.sql
    3. [root@node1 ~]# hive -f export.sql > /home/hs2.txt
    4. [root@node1 ~]# cat hs2.txt
  • 相关阅读:
    《机器学习实战》学习笔记(十二)
    探秘OpenAI的神奇之作:Sora技术揭秘
    14 使用Vue + el-form + rules实现图书信息录入功能实战
    flink故障恢复的流程(从检查点恢复状态)
    css3的attr函数使用,加载unicode矢量图标
    NEON优化:log10函数的优化案例
    RK3588 AP6398RS3之 BT 调试(二)
    猿创征文|磁盘满的本质分析——磁盘空间满与inode节点满
    Debian搭建smb服务器
    Python21天学习挑战赛Day(8)·多进程
  • 原文地址:https://blog.csdn.net/qq_52442855/article/details/134354154