Apache Hive的基本使用语法(二)

Hive SQL操作

7、修改表

  • 表重命名

    alter table score4 rename to score5;

  • 修改表属性值

    修改内外表属性

    ALTER TABLE table_name SET TBLPROPERTIES("EXTERNAL"="TRUE");

    修改表注释

    ALTER TABLE table_name SET TBLPROPERTIES ('comment' = new_comment);

  • 其余属性可参见
    点此官网链接查看

  • 添加分区

    ALTER TABLE tablename ADD PARTITION (month='201101');

  • 修改分区值

    ALTER TABLE tablename PARTITION (month='202005') RENAME TO PARTITION (month='201105');

  • 删除分区

    ALTER TABLE tablename DROP PARTITION (month='201105');

  • 添加列

    ALTER TABLE table_name ADD COLUMNS (v1 int, v2 string);

  • 修改列名

    ALTER TABLE test_change CHANGE v1 v1new INT;

  • 清空表(只可以清空内部表)

    TRUNCATE TABLE tablename;

  • 删除表

    DROP TABLE tablename;

8、数组类型(array)

  • 如下数据文件,有2个列,locations列包含多个城市:
    说明:name与locations之间制表符分隔,locations中元素之间逗号分隔

    可以使用array数组类型,存储locations的数据
    建表语句:

    create table myhive.test_array(name string, work_locations array<string>)
    row format delimited fields terminated by '\t'
    COLLECTION ITEMS TERMINATED BY ',';

  • 常用查询语句

    查询所有数据

    select * from myhive.test_array;

    查询loction数组中第一个元素

    select name, work_locations[0] location from myhive.test_array;

    查询location数组中元素的个数

    select name, size(work_locations) location from myhive.test_array;

    查询location数组中包含tianjin的信息

    select * from myhive.test_array where array_contains(work_locations,'tianjin');

9、映射类型(map)

  • map类型其实就是简单的指代:Key-Value型数据格式。 有如下数据文件,其中members字段是key-value型数据
    字段与字段分隔符: ",";需要map字段之间的分隔符:"#";map内部k-v分隔符:":"

  • 建表语句

    create table myhive.test_map(
    id int, name string, members map<string,string>, age int
    )
    row format delimited
    fields terminated by ','
    COLLECTION ITEMS TERMINATED BY '#'
    MAP KEYS TERMINATED BY ':';

  • 常用查询语句

    查询全部

    select * from myhive.test_map;

    查询father、mother这两个map的key

    select id, name, members['father'] father, members['mother'] mother, age from myhive.test_map;

    查询全部map的key,使用map_keys函数,结果是array类型

    select id, name, map_keys(members) as relation from myhive.test_map;

    查询全部map的value,使用map_values函数,结果是array类型

    select id, name, map_values(members) as relation from myhive.test_map;

    查询map类型的KV对数量

    select id,name,size(members) num from myhive.test_map;

    查询map的key中有brother的数据

    select * from myhive.test_map where array_contains(map_keys(members), 'brother');

10、结构类型(struct)

  • struct类型是一个复合类型,可以在一个列中存入多个子列,每个子列允许设置类型和名称
    有如下数据文件,说明:字段之间#分割,struct之间冒号分割

  • 建表语句

    create table myhive.test_struct(
    id string, info struct<name:string, age:int>
    )
    row format delimited
    fields terminated by '#'
    COLLECTION ITEMS TERMINATED BY ':';

  • 常用查询

    select * from hive_struct;

    直接使用列名.子列名 即可从struct中取出子列查询

    select ip, info.name from hive_struct;

11、数据查询

  • 查询语句基本语法如下(跟普通数据库sql查询基本一样):
    SELECT [ALL | DISTINCT]select_expr, select_expr, ... FROM table_reference [WHERE where_condition] [GROUP BYcol_list] [HAVING where_condition] [ORDER BYcol_list] [CLUSTER BYcol_list | [DISTRIBUTE BY col_list] [SORT BY col_list] ] [LIMIT number]

    排序查询

    SELECT * FROM orders WHERE useraddress like '%广东%' ORDER BY totalmoney DESC LIMIT 1;

    分组查询

    SELECT userid, AVG(totalmoney) AS avg_money FROM itheima.orders GROUP BY userid HAVING avg_money > 10000;

    Join连接查询

    SELECT o.orderid, o.userid, u.username, o.totalmoney, o.useraddress, o.paytime FROM itheima.orders o LEFT JOIN itheima.users u ON o.userid = u.userid;

    RLIKE查询(支持正则)

    SELECT * FROM itheima.orders WHERE useraddress RLIKE '.广东.';
    SELECT * FROM itheima.orders WHERE userphone RLIKEE '188\S{4}0\S{3}';

    UNION查询

    SELECT t_id FROM itheima.course WHERE t_id = '周杰轮'
    UNION ALL
    SELECT t_id FROM itheima.course WHERE t_id = '王力鸿'

12、数据抽样

  • 基于随机分桶抽样语法:
    SELECT ... FROM tbl TABLESAMPLE(BUCKET x OUT OF y ON(colname | rand()))

    SELECT * FROM orders TABLESAMPLE(BUCKET 1 OUT OF 10 ON rand());

  • 基于数据块抽样语法(每一次抽样的结果都一致):
    SELECT ... FROM tbl TABLESAMPLE(num ROWS | num PERCENT | num(K|M|G));

  1. num ROWS 表示抽样num条数据

  2. num PERCENT 表示抽样num百分百比例的数据

  3. num(K|M|G) 表示抽取num大小的数据,单位可以是K、M、G表示KB、MB、GB

    SELECT * FROM orders TABLESAMPLE(num rows);

13、虚拟列

  • 虚拟列是Hive内置的可以在查询语句中使用的特殊标记,可以查询数据本身的详细参数。
  • Hive目前可用3个虚拟列:
  1. INPUT__FILE__NAME,显示数据行所在的具体文件

  2. BLOCK__OFFSET__INSIDE__FILE,显示数据行所在文件的偏移量

  3. ROW__OFFSET__INSIDE__BLOCK,显示数据所在HDFS块的偏移量
    注:此虚拟列需要设置:SET hive.exec.rowoffset=true 才可使用

    SELECT *, INPUT__FILE__NAME, BLOCK__OFFSET__INSIDE__FILE, ROW__OFFSET__INSIDE__BLOCK FROM course;

Hive函数

  • Hive的函数分为两大类:内置函数(Built-in Functions)、用户定义函数UDF(User-Defined Functions):

    Hive函数官方文档,点此查看

  • Hive内置函数(举例说明)

    查看当下可用的所有函数

    show functions

    查看函数的使用方式

    describe function extended funcname

  • 数学函数

    取整函数: round 返回double类型的整数值部分 (遵循四舍五入)

    select round(3.1415926);

    指定精度取整函数: round(double a, int d) 返回指定精度d的double类型

    select round(3.1415926,4);

    取随机数函数: rand 每次执行都不一样 返回一个0到1范围内的随机数

    select rand();

    指定种子取随机数函数: rand(int seed) 得到一个稳定的随机数序列

    select rand(3);

    求数字的绝对值

    select abs(-3);

    得到pi值(小数点后15位精度)

    select pi();

  • 集合函数

  • 类型转换函数

  • 日期函数

  • 条件函数

  • 数据脱敏函数

  • 字符串函数

  • 其他函数

    至此,Apache Hive的基本使用语法分享结束!!!

相关推荐
NON-JUDGMENTAL11 小时前
Hadoop 集群基础指令指南
大数据·hadoop·分布式
hnlucky13 小时前
hadoop伪分布式模式
大数据·hadoop·分布式
rylshe131414 小时前
如何在idea中写spark程序
hadoop
微臣愚钝14 小时前
Liunx安装Apache Tomcat
java·tomcat·apache
IT成长日记15 小时前
【Hive入门】Hive性能优化:执行计划分析EXPLAIN命令的使用
hive·hadoop·性能优化·explain·执行计划分析
SeaTunnel1 天前
从架构原理到落地实践:Apache SeaTunnel×Cloudberry数据集成全解读
架构·apache
火龙谷1 天前
【hadoop】案例:MapReduce批量写入HBase
hadoop·hbase·mapreduce
wangzhongyudie1 天前
SQL实战:03之SQL中的递归查询
数据库·hive·sql
API_technology1 天前
《淘宝 API 数据湖构建:实时商品详情入湖 + Apache Kafka 流式处理指南》
数据库·分布式·数据挖掘·kafka·apache
IT成长日记1 天前
【Hive入门】Hive函数:内置函数与UDF开发
数据仓库·hive·hadoop·udf