AmosCloud

Library

Have a Question?

If you have any question you can ask below or enter what you are looking for!

Hive2

Hive

DML

  1. load

    • 语法
      LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

    • 使用场景:
      通常用于测试时将少量数据从Linux本地上传到Hive表中
      实际生产中通常直接使用外部表,并指定表的location,将表映射到指定的HDFS文件目录

  2. insert

    • 语法:
      INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

    • 使用场景:
      测试时将数据单条插入表中,
      生产环境将数仓中的表查询结果插入到下一层的表中作为增量插入

  3. export

    • 语法:
      EXPORT TABLE tablename [PARTITION (part_column="value"[, ...])] TO 'export_target_path' [ FOR replication('eventid') ]

    • 使用场景
      通常用于数据备份,例如将一个表的数据,导出到另外一个HDFS集群中
      使用export的好处,export可以直接将表中包含的所有分区和文件全部一次性读取和导出,如果自己手动操作,需要找到表中的所有文件

  4. import

    • 语法
      IMPORT [[EXTERNAL] TABLE new_or_original_tablename [PARTITION (part_column="value"[, ...])]] FROM 'source_path' [LOCATION 'import_target_path']

    • 使用场景:
      通常用于export导出的数据,追加或者直接根据导出的数据创建新的表,
      import也允许自定义location来指定新创建的表保存的目录

Hive客户端特殊用法

  • 产生背景
    通常离线数仓的统计任务会选择在凌晨定时执行,
    原因1:0点之后,前一天的数据产生完成,可以对整个自然日的数据进行统计,2: 0点之后数据采集压力较小,服务器负载较低

    hive客户端需要进行交互式查询,不方便设置定时任务,
    所以Hive提供了两种将HQL直接提交给Hive客户端执行的方式
    hive -e "SQL语句"
    hive -f HQL脚本

  • 例如:
    每天凌晨1点,
-- 1.将原始文件导入t1

-- 2.t1查询的结果导入t2
-- 3.t2的结果导出到文件

DQL

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]
  • HQL查询中的排序操作
  1. ORDER BY
    需要注意的是ORDER BY是全局排序,Hive底层运行MR,如果需要进行全局排序,意味着底层的MR只有一个Reducer,所有数据会进入同一个reducer进行排序:
    数据倾斜!

  2. DISTRIBUTE BY
    设置HQL底层执行MR时,按照哪个字段进行分区(MR shuffle中的分区)

  3. SORT BY
    设置使用DISTRIBUTE BY分区后的数据,在分区内按照哪个字段排序

  4. CLUSTER BY
    DISTRIBUTE BY和SORT BY是同一字段时,可以直接使用CLUSTER BY

Hive的函数

1. hive自带的函数可以在官网中查看到所有函数和用法

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions

2. hive在客户端中提供了函数的查看方式

-- 查看当前hive中可用的所有函数
SHOW FUNCTIONS;
-- 查看某个函数具体的用法和意义
DESCRIBE FUNCTION <function_name>;
-- 查看某个函数详细用法和案例
DESCRIBE FUNCTION EXTENDED <function_name>;

3. hive也提供了用户自定义的方式添加函数到Hive的函数库

由于有些逻辑过于复杂如果直接使用HQL编写,可能无法实现,或者维护成本过高,这是可以使用JavaAPI编写具体的操作,再将这个操作注册到Hive称为Hive的函数

  • UDF(user defind function)
  1. 创建Mavne工程引入依赖

    <dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>2.3.9</version>
    </dependency>
  2. 创建类 继承UDF类
    org.apache.hadoop.hive.ql.exec.UDF

  3. 定义方法evaluate,实现具体功能

    • 例如实现将30/Jun/2021:03:19:04转换为 2021-06-30 03:19:04
public class DTFormat extends UDF {

    public String evaluate(String dt) {
//    30/Jun/2021:03:19:04  => 2021-06-30 03:19:04
//    dd/MMM/yyyy:HH:mm:ss  => yyyy-MM-dd HH:mm:ss
        String res = "0000-00-00 00:00:00";
        SimpleDateFormat parser = new SimpleDateFormat("dd/MMM/yyyy:HH:mm:ss", Locale.US);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            res = formatter.format(parser.parse(dt));
        } catch (ParseException e) {
            System.out.println(dt);
        } finally {
            parser = null;
            formatter = null;
        }
        return res;
    }
}
  1. 将工程打成jar,上传到HDFS

  2. 在Hive客户端中或者HQL脚本中注册函数

create temporary function DTFormat as 'com.xahj.bd2102.hive.udf.DTFormat' using jar 'hdfs://node01:9000/hive_udf/hive-udf.jar';
  1. 使用自定义函数

    • 在HQL中使用注册是填入的函数名