zoukankan      html  css  js  c++  java
  • hive学习 踏雪扬尘

    Hive 简介

    Hive 由 Facebook 实现并开源,是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据 映射
    为一张数据库表,并提供 HQL(Hive SQL)查询功能,底层数据是存储在 HDFS 上。Hive 的本质是将
    SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利 用 HQL 处理和计算
    HDFS 上的结构化的数据,适用于离线的批量数据计算。

    Hive 特点

    优点:
    1、可扩展性,横向扩展,Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务
    横向扩展
    纵向扩展
    2、延展性,Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数
    3、良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行

    缺点:
    1、Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结果导入到文件中
    2、Hive 的查询延时严重,因为 MapReduce的启动过程消耗很长时间,所以不能用在交互查询系统
    中。
    3、Hive 不支持事务(因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而不是
    OLTP(联机事务处理),这就是数据处理的两大级别)

    Hive 和 RDBMS 的对比

    Hive 的架构

    基本组成
    一、用户接口
    CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 hive 命令行与 hive 进
    行交互,最常用(学习,调试,生产)
    JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过 这连接至
    Hive server 服务
    Web UI,通过浏览器访问 Hive
    二、Thrift Server
    Hive 集成了该服务,能让不同的编程语言调用 hive 的接口
    三、元数据存储
    解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)
    一般是远程的, hive 和MySQL之间通过 hive metastore 服务交互。
    Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
    (1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
    (2) 编译器:编译器是将语法树编译为逻辑执行计划
    (3) 优化器:优化器是对逻辑执行计划进行优化
    (4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划

    Hive 的数据存储

    Hive 中包含以下数据模型:
    database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
    table:在 HDFS 中表现所属 database 目录下一个文件夹
    external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径
    partition:在 HDFS 中表现为 table 目录下的子目录
    bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散列之后的多个文件
    view:与传统数据库类似,只读,基于基本表创建

    DDL表操作

    建表语句

    CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name --
    (Note: TEMPORARY available in Hive 0.14.0 and later)
    [(col_name data_type [column_constraint_specification] [COMMENT col_comment],
    ... [constraint_specification])]
    [COMMENT table_comment]
    [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
    [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)]
    INTO num_buckets BUCKETS]
    [SKEWED BY (col_name, col_name, ...) -- (Note: Available in
    Hive 0.10.0 and later)]
    ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
    [STORED AS DIRECTORIES]
    [
    [ROW FORMAT row_format]
    [STORED AS file_format]
    | STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] --
    (Note: Available in Hive 0.6.0 and later)
    ]
    [LOCATION hdfs_path]
    [TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in
    Hive 0.6.0 and later)
    [AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not
    supported for external tables)
    

    DML操作

    1、装载数据
    LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION
    (partcol1=val1, partcol2=val2 ...)]
    load data local inpath "/home/data/student.txt" into table student;

    2, 插入数据
    插入一条数据:
    INSERT INTO TABLE tablename VALUES(a,b,c)
    利用查询语句将结果导入新表:
    INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)
    [IF NOT EXISTS]] select_statement1 FROM from_statement;
    多重插入
    FROM from_statement
    INSERT OVERWRITE TABLE table_name1 [PARTITION (partcol1=val1, partcol2=val2
    ...)] select_statement1
    INSERT OVERWRITE TABLE table_name2 [PARTITION (partcol1=val1, partcol2=val2
    ...)] select_statement2] ...

    from student
    insert into table student_ptn partition (department = 'IS') select id,sex,name,age where department = 'IS'
    insert into table student_ptn partition (department = 'CS') select id,sex,name,age where department = 'CS'
    insert into table student_ptn partition (department = 'MA') select id,sex,name,age where department = 'MA'

    3,导出数据
    INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement
    insert overwrite local directory "/home/data/cs_student" select * from student where department = 'CS';
    insert overwrite directory "/home/data/cs_student" select * from student where department = 'CS';

    4,查询数据

    SELECT [ALL | DISTINCT] select_expr, select_expr, ...
    FROM table_reference
    [WHERE where_condition]
    [GROUP BY col_list]
    [ORDER BY col_list]
    [CLUSTER BY col_list
    | [DISTRIBUTE BY col_list] [SORT BY col_list]
    ]
    [LIMIT [offset,] rows]
    

    数据类型

    原子数据类型

    复杂数据类型
    复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT)

    总结:在关系型数据库中,我们至少需要三张表来定义,包括学生基本表、爱好表、成绩表; 但在
    Hive 中通过一张表就可以搞定了。也就是说,复合数据类型把多表关系通过一张表就 可以实现了。

    Hive函数


    一、关系运算:
    1. 等值比较: =
    2. 等值比较:<=>
    3. 不等值比较: <>和!=
    4. 小于比较: <
    5. 小于等于比较: <=
    6. 大于比较: >
    7. 大于等于比较: >=
    8. 区间比较
    9. 空值判断: IS NULL
    10. 非空判断: IS NOT NULL
    10. LIKE比较: LIKE
    11. JAVA的LIKE操作: RLIKE
    12. REGEXP操作: REGEXP
    二、数学运算:
    1. 加法操作: +
    2. 减法操作: –
    3. 乘法操作: *
    4. 除法操作: /
    5. 取余操作: %
    6. 位与操作: &
    7. 位或操作: |
    8. 位异或操作: ^
    9.位取反操作: ~
    三、逻辑运算:
    1. 逻辑与操作: AND 、&&
    2. 逻辑或操作: OR 、||
    3. 逻辑非操作: NOT、!
    四、复合类型构造函数
    1. map结构
    2. struct结构
    3. named_struct结构
    4. array结构
    5. create_union
    五、复合类型操作符
    1. 获取array中的元素
    2. 获取map中的元素
    3. 获取struct中的元素
    六、数值计算函数
    1. 取整函数: round
    2. 指定精度取整函数: round
    3. 向下取整函数: floor
    4. 向上取整函数: ceil
    5. 向上取整函数: ceiling
    6. 取随机数函数: rand
    7. 自然指数函数: exp
    8. 以10为底对数函数: log10
    9. 以2为底对数函数: log2
    10. 对数函数: log
    11. 幂运算函数: pow
    12. 幂运算函数: power
    13. 开平方函数: sqrt
    14. 二进制函数: bin
    15. 十六进制函数: hex
    16. 反转十六进制函数: unhex
    17. 进制转换函数: conv
    18. 绝对值函数: abs
    19. 正取余函数: pmod
    20. 正弦函数: sin
    21. 反正弦函数: asin
    22. 余弦函数: cos
    23. 反余弦函数: acos
    24. positive函数: positive
    25. negative函数: negative
    七、集合操作函数
    1. map类型大小:size
    2. array类型大小:size
    3. 判断元素数组是否包含元素:array_contains
    4. 获取map中所有value集合
    5. 获取map中所有key集合
    6. 数组排序
    八、类型转换函数
    1. 二进制转换:binary
    2. 基础类型之间强制转换:cast
    九、日期函数
    1. UNIX时间戳转日期函数: from_unixtime
    2. 获取当前UNIX时间戳函数: unix_timestamp
    3. 日期转UNIX时间戳函数: unix_timestamp
    4. 指定格式日期转UNIX时间戳函数: unix_timestamp
    5. 日期时间转日期函数: to_date
    6. 日期转年函数: year
    7. 日期转月函数: month
    8. 日期转天函数: day
    9. 日期转小时函数: hour
    10. 日期转分钟函数: minute
    11. 日期转秒函数: second
    12. 日期转周函数: weekofyear
    13. 日期比较函数: datediff
    14. 日期增加函数: date_add
    15. 日期减少函数: date_sub
    十、条件函数
    1. If函数: if
    2. 非空查找函数: COALESCE
    3. 条件判断函数:CASE
    4. 条件判断函数:CASE
    十一、字符串函数
    1. 字符ascii码函数:ascii
    2. base64字符串
    3. 字符串连接函数:concat
    4. 带分隔符字符串连接函数:concat_ws
    5. 数组转换成字符串的函数:concat_ws
    6. 小数位格式化成字符串函数:format_number
    7. 字符串截取函数:substr,substring
    8. 字符串截取函数:substr,substring
    9. 字符串查找函数:instr
    10. 字符串长度函数:length
    11. 字符串查找函数:locate
    12. 字符串格式化函数:printf
    13. 字符串转换成map函数:str_to_map
    14. base64解码函数:unbase64(string str)
    15. 字符串转大写函数:upper,ucase
    16. 字符串转小写函数:lower,lcase
    17. 去空格函数:trim
    18. 左边去空格函数:ltrim
    19. 右边去空格函数:rtrim
    20. 正则表达式替换函数:regexp_replace
    21. 正则表达式解析函数:regexp_extract
    22. URL解析函数:parse_url
    23. json解析函数:get_json_object
    24. 空格字符串函数:space
    25. 重复字符串函数:repeat
    26. 左补足函数:lpad
    27. 右补足函数:rpad
    28. 分割字符串函数: split
    29. 集合查找函数: find_in_set
    30. 分词函数:sentences
    31. 分词后统计一起出现频次最高的TOP-K
    32. 分词后统计与指定单词一起出现频次最高的TOP-K
    十二、混合函数
    1. 调用Java函数:java_method
    2. 调用Java函数:reflect
    3. 字符串的hash值:hash
    十三、XPath解析XML函数
    1. xpath
    2. xpath_string
    3. xpath_boolean
    4. xpath_short, xpath_int, xpath_long
    5. xpath_float, xpath_double, xpath_number
    十四、汇总统计函数(UDAF)
    1. 个数统计函数: count
    2. 总和统计函数: sum
    3. 平均值统计函数: avg
    4. 最小值统计函数: min
    5. 最大值统计函数: max
    6. 非空集合总体变量函数: var_pop
    7. 非空集合样本变量函数: var_samp
    8. 总体标准偏离函数: stddev_pop
    9. 样本标准偏离函数: stddev_samp
    10.中位数函数: percentile
    11. 中位数函数: percentile
    12. 近似中位数函数: percentile_approx
    13. 近似中位数函数: percentile_approx
    14. 直方图: histogram_numeric
    15. 集合去重数:collect_set
    16. 集合不去重函数:collect_list
    十五、表格生成函数Table-Generating Functions (UDTF)
    1. 数组拆分成多行:explode
    2. Map拆分成多行:explode

    hive 全操作

    1、建库

    create database mydb;
    create database if no exists mydb;
    

    2、查询数据库

    查询库列表:show databases;
    查询库详细信息:desc database [extended] mydb;
    查询当前正在使用的库: select current_database();
    

    3、删除数据库

    drop database mydb;
    drop database if exists mydb;
    drop database if exists mydb [restrict|cascade];
    

    4、先进入我们要操作的数据库/切换库

    use mydb;
    

    5、查看数据库里面的表

    show tables;
    show tables in mydb;
    

    6、添加表

    创建内部表(Managered_Table)
    create table mingxing(id int, name string, sex string, age int, department string comment "ss") comment "table comment" row format delimited fields terminated by ',';
    
    show create table mingxing;
    
    创建外部表(External_Table)
    create external table mingxing(id int, name string, sex string, age int, department string)
    row format delimited fields terminated by ',' location '/root/hivedata';
    注意:创建外部表的时候指定location的位置必须是目录,不能是单个文件
    
    跟内部表对比:
    1、在创建表的时候指定关键字: external
    2、一般来说,创建外部表,都需要指定一个外部路径
    
    内部表和外部表的区别
    内部表和外部表的选择
    
    不管是创建外部表还是内部表,都可以指定数据存储目录
    默认的目录:
    hdfs://hadoop02:9000/user/hive/warehouse/myhive.db/student/student.txt
    
    创建分区表
    create table mingxing(id int, name string, sex string, age int, department string)
    partitioned by (city string)
    row format delimited fields terminated by ',';
    注意:partitioned里的字段不是能是表中声明的字段
    分区字段是一个虚拟列。分区字段的值是不存在于数据文件中的。
    分区字段的使用和普通字段没有区别
    
    分区字段/表字段
    
    创建分桶表
    create table mingxing(id int, name string, sex string, age int, department string)
    clustered by(id) sorted by(age desc) into 4 buckets
    row format delimited fields terminated by ',';
    注意:clustered里的字段必须要是表字段中出现的字段
    
    分桶字段/表字段
    
    分桶字段和排序字段可以不一样,分桶字段和排序字段都必须是表字段中的一部分
    

    7、删除表

    drop table mingxing;
    drop table if exists mingxing;
    

    8、对表进行重命名

    alter table mingxing rename to student;
    

    9、对表的字段进行操作(增加add,删除drop,修改change,替换replace)

    增加字段:
    alter table mingxing add columns (province string);
    alter table mingxing add columns (province string, xxx bigint);
    
    删除字段:
    drop(不支持) XXXXX
    
    修改字段:
    alter table mingxing change age newage string;
    alter table mingxing change age newage string after id;
    alter table mingxing change age newage string first;
    
    替换字段
    alter table mingxing replace columns(id int, name string, sex string);
    

    10、对表中的分区进行操作(添加分区,删除分区,修改分区)

    增加分区:
    alter table mingxing add partition(city='beijing');
    alter table mingxing add partition(city='beijing') location '/city_beijing';
    alter table mingxing add partition(city='beijing') partition(city='tianjin');
    
    删除分区:
    alter table mingxing drop partition(city='beijing');
    alter table mingxing drop partition(city='beijing'), partition(city='tianjin');
    
    修改分区路径:
    alter table mingxing partition(city="beijing") set location "/mingxing_beijing";
    

    11、查询显示命令

    查看库:show databases;
    查看表:show tables;
    查看建表完整语法:show create table mingxing;
    查看内置函数库:show functions;
    查看函数的详细手册:desc function extended concat;
    查看分区:show partitions mingxing;
    查看表的字段:desc mingxing;
    查看表的详细信息:desc extended mingxing;
    查看表的格式化了之后的详细信息:desc formatted mingxing;
    

    12、load方式导入数据

    load data ..... [overwrite] into table .....
    
    导入本地相对路径的数据
    load data local inpath './student.txt' into table mingxing;
    load data local inpath './student.txt' overwrite into table mingxing;
    (覆盖导入)
    
    导入本地绝对路径数据:
    load data local inpath '/home/hadoop/student.txt' into table mingxing;
    
    导入本地数据,相当于复制或者上传
    
    导入HDFS上的简便路径数据:
    load data inpath '/home/hadoop/student.txt' into table mingxing;
    
    导入HDFS上的全路径模式下的数据:
    load data inpath 'hdfs://hadoop01:9000/root/hivedata/student.txt' into table mingxing;
    
    导入HDFS上的数据到hive表,表示截切,移动
    

    13、利用insert关键字往表中插入数据

    五种:
    1、单条记录插入
    2、单重插入
    3、多重插入
    4、分区插入
    5、分桶插入
    6、CTAS
    
    insert ...  values ..
    insert  ... select ..
    
    最有趣最有用最常用的:  hadoop fs -put /source /dst
    hive是一个读模式的数据仓库
    
    单条数据插入:
    insert into table mingxing values(001,'huangbo','male',50,'MA');
    
    单重插入模式: insert ... select ....
    insert into table student select id,name,sex,age,department from mingxing;
    注意:查询出的字段必须是student表中存在的字段
    
    多重插入模式:
    from mingxing
    insert into table student1 select id,name,sex,age
    insert into table student2 select id,department;
    
    from mingxing2
    insert into table student1 partition(department='MA') select id,name,sex ,age where department='MA'
    insert into table student1 partition(department='CS') select id,name,sex ,age where department='CS'; 
    
    分区插入:
    需要手动的创建分区
    alter table student add partition (city="zhengzhou")
    load data local inpath '/root/hivedata/student.txt' into table student partition(city='zhengzhou');
    
    
    CTAS(create table ... as select ...)(直接把查询出来的结果存储到新建的一张表里)
    内部表/内建表
    create table student as select id,name,age,department from mingxing;
    注意:自动新建的表中的字段和查询语句出现的字段的名称,类型,注释一模一样
    
    限制:
    1、不能创建外部表
    2、不能创建分区表
    3、不能创建分桶表
    
    分桶插入:
    
    创建分桶表:
    create table mingxing(id int, name string, sex string, age int, department string)
    clustered by(id) sorted by(age desc) into 4 buckets
    row format delimited fields terminated by ',';
    
    不能使用load方式直接往分桶表中导入数据
    插入数据:
    insert into table mingxing select id,name,sex,age,department from mingxing2
    distribute by id sort by age desc;
    注意:查询语句中的分桶信息必须和分桶表中的信息一致
    

    14、like关键字使用:复制表结构

    create [external] table student like mingxing;
    

    15、利用insert导出数据到本地或者hdfs

    单模式导出数据到本地:
    insert overwrite local directory '/root/outputdata' select id,name,sex,age,department from mingxing;
    
    多模式导出数据到本地:
    from mingxing
    insert overwrite local directory '/root/outputdata1' select id, name
    insert overwrite local directory '/root/outputdata2' select id, name,age
    
    简便路径模式导出到hdfs:
    insert overwrite directory '/root/outputdata' select id,name,sex,age,department from mingxing;
    
    全路径模式查询数据到hdfs:
    insert overwrite directory 'hdfs://hadoop01:9000/root/outputdata1' select id,name,sex,age,department from mingxing;
    
    local :导出到本地目录
    overwrite :表示覆盖
    

    16、清空数据库表中的数据

    truncate table mingxing2;
    清空表只是清空该表的所有数据文件
    

    17、select查询

    order by : 全局排序
    
    sort by :局部排序
    一般来说,要搭配 分桶操作使用
    distribute by id sort by age desc;
    
    distribute by : 纯粹就是分桶
    在使用distribute by的时候:要设置reduceTask的个数
    
    cluster by : 既分桶,也排序
    cluster by age = distribute by age sort by age;
    
    cluster by 和 sort by 不能同时使用
    
    where , group by, distinct ,having ,  case...when, ....
    

    UDF案例

    依赖:

    org.apache.hive
    hive-exec
    1.2.1

    1、先开发一个简单的 java 类,继承 org.apache.hadoop.hive.ql.exec.UDF,重载 evaluate 方法
    public class ToLowerCase extends UDF {
    // 必须是 public,并且 evaluate 方法可以重载
    public String evaluate(String field)
    {
    String result = field.toLowerCase();
    return result;
    }
    }

    2、打成 jar 包上传到服务器 /home/data/utf.jar

    3、将 jar 包添加到 hive 的 classpath
    hive>add JAR /home/data/utf.jar;

    4、查看加入的 jar 的命令: hive> list jar;

    5、创建临时函数与开发好的 class 关联起来
    hive>create temporary function tolowercase as 'com.naixue.hive.ToLowerCase';

    6、至此,便可以在 hql 在使用自定义的函数
    select tolowercase(name) from student;

    特殊分隔符的处理

    数据:
    11||zhangsan||22
    22||lisi||22
    33||wangwu||22
    建表语句:
    create table bi_test(id int,name string) row format delimited fields terminated by '||';
    注意项:默认的分隔符只能是char类型。

    Storage Information

    SerDe Library: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
    InputFormat: org.apache.hadoop.mapred.TextInputFormat
    OutputFormat: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

    Hive特殊分隔符处理

    Hive 对文件中字段的分隔符默认情况下只支持单字节分隔符,如果数据文件中的分隔符是多字符的,如下所示:
    01||huangbo
    02||xuzheng
    03||wangbaoqiang

    1 使用 RegexSerDe 通过正则表达式来抽取字段

    create table t_bi_reg(id string,name string) row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' with serdeproperties('input.regex'='(.)\|\|(.)','output.format.string'='%1$s %2$s') stored as textfile;

    hive>load data local inpath '/home/data/bi2.txt' into table t_bi_reg;

    hive>select * from t_bi_reg;

    2 通过自定义 InputFormat 解决特殊分隔符问题
    其原理是在 inputformat 读取行的时候将数据中的“多字节分隔符”替换为 hive 默认的分隔符(ctrl+A 亦即 \001)或用于替代的单字符分隔符,以便 hive 在 serde 操作时按照默认的单字节分隔符进行字段抽取

  • 相关阅读:
    文本信息检索基本知识【转】
    单纯形【转】
    云飘忽不定?且看多种多样的云存储应用【转】
    海量数据来临 分层存储才是解决之道【转】
    伽玛函数_gamma
    设计模式理解创建模式
    Memory management demo from TCPL
    Welcome to asm!
    Monokai scheme for Qt
    Astyle for qtcreator
  • 原文地址:https://www.cnblogs.com/yyystar/p/15680412.html
Copyright © 2011-2022 走看看