zoukankan      html  css  js  c++  java
  • HIve常用函数

    最近使用了hive一些高级函数,在此记录一下

    一:Hive是什么

     Hive是面向大数据的数据仓库,是一种将SQL转换为mapreduce的工具。

    二:hive表

    内表、外表、分区、桶表、location、压缩这些都是表的属性,每个之间没有什么关系(内表外表不可以同时存在)。也就是说一个表既可以是内表,也可是分区表桶表,也可以规定存放路径还可压缩

    内表

               内表其实就是将拷贝到Hive的目录下,表和数据关联,表删除数据删除。

                        create table if not exists table_test
                        (
                                 aa string
                        )
                        row format delimited fields terminated by '01'
                        location '/hive/table/table_test';

           以上的语句就是建一个内表,一行是一条记录,字段之间按照01分割,数据最终存放的位置是/hive/table/table_test。

      装载数据:

        insert into table_test

        select aa from table_aa;

        或

        load data inpath '/hive/date/table_test' overwrite into table table_test;(overwrite是覆盖数据,可去掉)

    外表

               内表相对来说是不安全的:因为表删除后数据就丢了。所以还有外表,将数据和表分开(外表drop后重新,什么都没有变会将数据load两份)。

                        create external table if not exists table_test

                        (
                                 aa string
                        ) 
                        row format delimited fields terminated by '01'
                        location '/hive/table/table_test';

           以上的语句就是建一个外表,一行是一条记录,字段之间按照01分割,数据最终存放的位置是/hive/table/table_test。

      装载数据:

        load data inpath '/hive/date/table_test' overwrite into table table_test;(overwrite是覆盖数据,可去掉)

    分区表

               分区表其实就是将数据按照一个字段放进去不同的文件夹,减少数据扫描。(分区表是文件夹名字就是字段名字,分文件夹)

                        create table if not exists table_test
                        (
                                 aa string
                        ) partitioned by (date string,hour string)
                        row format delimited fields terminated by '01'
                        location '/hive/table/table_test';

           以上的语句就是建一个内表同时又是分区表,一行是一条记录,字段之间按照01分割,数据最终存放的位置是/hive/table/table_test。

      装载数据:

        insert into table_test partition (date=20190908,hour)

        select aa,hour from table_aa;

        或

        load data inpath '/hive/date/table_test' overwrite into table table_test partition (date=20190908,hour=12);(overwrite是覆盖数据,可去掉)

    桶表

               桶表其实就是将数据按照一个字段放进去不同文件,减少数据扫描。(将date取hash,对结果对4取余确定文件,个人理解哈哈)

                        create table if not exists table_test
                        (
                                 aa string
                        ) clustered by(date) into 4 buckets

                        row format delimited fields terminated by '01'
                        location '/hive/table/table_test';

           以上的语句就是建一个内表同时又是桶表,一行是一条记录,字段之间按照01分割,数据最终存放的位置是/hive/table/table_test。

      装载数据:

        insert into table_test

        select aa,date from table_aa;

        或

        load data inpath '/hive/date/table_test' overwrite into table table_test;(该操作是不会将结果分文件的,其实没有起到桶表的作用)

    表压缩

            表压缩的好处不言而喻,节约空间减少传输,以下是最优的选择。

                   create table if not exists table_test
                   (
                               aa string
                   ) partitioned by (date string,hour string)
                   row format delimited fields terminated by '01'
        stored as orc
                   location '/hive/table/table_test'
                   tblproperties ('orc.compress'='SNAPPY');

        //stored as后可跟文件存储格式(TEXTFILE、SEQUENCEFILE、RCFILE、PARQUET)  

        // ('orc.compress'='')后可跟压缩方式(ZLIB、SNAPPY、NONE) 选项都是支持的

      装载数据:

        insert into table_test

        select aa,date from table_aa;

        或

        load data inpath '/hive/date/table_test' overwrite into table table_test;(该操作是不会将结果分文件的,其实没有起到桶表的作用)

    三:hive高级函数及特性

    1.json_tuple函数

                   例子:select aa from table lateral view json_tuple(jsonstr,'aa','bb','cc') tmp1 as aa,bb,cc;

        原值:

                           jsonstr

                          {aa:1,bb:2,cc:3}

        结果值:

                           aa            bb            cc  

                           1               2             3

        将表中jsonstr按照json类型解析,将其中aa,bb,cc的值提取出来,生成的列叫做aa,bb,cc。没有值的数据会默认填空。非常适合处理脏json数据。

    2.explode函数

                   例子:select explode(split(regexp_replace(regexp_replace(jsonstr,'\[\{',''),'}]',''),'},\{')) as  sale_info from table ;

        原值:

                           jsonstr

                          [{aa:1,bb:2,cc:3},{aa:4,bb:5,cc:6},{aa:7,bb:8,cc:9}]

        结果值:

                           jsonstr

                          aa:1,bb:2,cc:3

            aa:4,bb:5,cc:6

            aa:7,bb:8,cc:9

        将表中jsonstr替换掉[{和}]按照},{将数据分为数组,然后展开

    3.hive表常用操作

                   ALTER TABLE TABLE RENAME TO AA;    将表的名称改变

                   ALTER TABLE TABLE ADD COLUMNS (BB STRING COMMENT);  //增加列

          修改速度很快(原因是修改了元数据)

          以后插入数据的时候会多需要一列的数据。

          查询历史数据的BB列为NULL值。

          真正看历史文件是没有BB列的。

                   ALTER TABLE TABLE REPLACE COLUMNS (BB STRING COMMENT);  //删除列,基本理论和增加一致

                   ALTER TABLE TABLE DROP PARTITION (STAT_YEAR_MONTH='20190908');删除分区

          TRUNCATE TABLE TABLE;清空表

  • 相关阅读:
    Python实现快排
    numpy基础篇-简单入门教程2
    Python 基本语法
    numpy基础篇-简单入门教程1
    Markdown编辑器 常用语法
    Git学习笔记 2,GitHub常用命令
    Git学习笔记 1,GitHub常用命令1
    交通 数据集
    杭电oj 求绝对值
    杭电oj 计算两点间的距离
  • 原文地址:https://www.cnblogs.com/wuxiaolong4/p/11568290.html
Copyright © 2011-2022 走看看