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的基本使用语法分享结束!!!

相关推荐
ALLSectorSorft10 小时前
上门服务小程序会员系统框架设计
小程序·apache
杨过姑父11 小时前
部署开源版禅道,修改apache端口无效解决
bug·apache·软件工程·issue
酷爱码12 小时前
Spring Boot 整合 Apache Flink 的详细过程
spring boot·flink·apache
IvanCodes14 小时前
七、Sqoop Job:简化与自动化数据迁移任务及免密执行
大数据·数据库·hadoop·sqoop
冬至喵喵15 小时前
【hive】函数集锦:窗口函数、列转行、日期函数
大数据·数据仓库·hive·hadoop
Theodore_10221 天前
大数据(2) 大数据处理架构Hadoop
大数据·服务器·hadoop·分布式·ubuntu·架构
簌簌曌1 天前
CentOS7 + JDK8 虚拟机安装与 Hadoop + Spark 集群搭建实践
大数据·hadoop·spark
黑客老李1 天前
JavaSec | SpringAOP 链学习分析
java·运维·服务器·开发语言·学习·apache·memcached
Theodore_10221 天前
大数据(1) 大数据概述
大数据·hadoop·数据分析·spark·hbase