黑马-hive学习笔记(3)

一、Hive参数配置

        Hive作为一款复杂的数据仓库软件,除了一些默认的属性行为之外,还支持用户配置属性进行修改,使得在某些场景下满足用户的需求。

      作为用户端我们需要掌握两件事:

      一是:Hive有哪些属性支持修改,修改了有什么功能

     二是:Hive支持哪种方式进行修改,修改是临时生效还是永久生效的

1-1  配置方式1:hive-site.xml配置文件 
     问题1:hive的参数配置文件都有哪些?

            Hive的参数配置文件主要有两个,分别是hive-site.xmlhive-default.xml.template

         1.)hive-site.xml: 这个文件用于配置Hive的运行参数,比如Hive Metastore的数据库连接信息、执行引擎选择(MapReduce or Tez or Spark)、Hive临时文件存放路径等。

         2.) hive-default.xml.template: 这个文件提供了Hive的所有配置参数的默认值和参数的详细说明。这个文件只用于参考,不会被Hive读取。如果需要修改某个配置项的值,需要把对应的配置项复制到hive-site.xml中然后修改。

这两个文件一般都在Hive的安装目录的conf子目录下面。

          注意1: hive-site.xml这个文件在初次安装Hive的时候可能不存在,需要手动创建。你通常可以将示例文件hive-default.xml.template改名为hive-site.xml开始使用,然后根据需要修改值。

          注意2:这些设置仅在重启Hive服务后才会生效。

    问题2:在hive中找不到配置文件hivemetastore-site.xml和hiveserver2-site.xml?          

          Hive的配置信息通常存储在hive-site.xml文件中,这个文件包含了包括metastore配置和HiveServer2配置在内的所有配置信息。Hive默认的配置文件是hive-default.xml.template,你可以将其复制并改名为hive-site.xml,然后修改其中的配置信息。

            注意,有些版本的Hive可能会把metastore的配置信息和HiveServer2的配置信息分别存放在hivemetastore-site.xmlhiveserver2-site.xml两个文件中,但是这并不是标准或者通用的做法。在大部分情况下,你应该在hive-site.xml文件中找到并修改这些配置信息。

             如果你无法在你的Hive安装目录中找到这两个文件,可能是因为你的Hive版本并不支持这种配置方式,你可以查阅你的Hive版本的官方文档以获取更准确的信息。

1-2  配置方式2:hiveconf命令行参数

       1)是什么?

      iveconf是一个命令行的参数,用于在使用Hive CLI或者Beeline CLI的时候指定配置参数这种方式的配置在整个的会话session中有效,会话结束,失效,也就是说此选项可以用来临时覆盖hive-site.xml文件里的设置。

      2)怎么用

        hive -hiveconf property=value

        --这里的 property 和 value 分别是你想要设置的参数名称和值。

      3)注意事项

         这里设置的参数仅在当前的hive会话中有效,会话关闭后,参数设置就失效了。如果你希望配置的参数永久有效,需要在hive-site.xml里进行设置。如果参数在-hiveconf和hive-site.xml中都设置了,那么-hiveconf设置的值会覆盖hive-site.xml中的设置,也就是说,-hiveconf在当前会话中优先级是要高于配置文件的。

      4)一些问题

       问题1:hiveconf命令行参数需要定位到hive所在的目录下才能使用吗?

             一般来说,如果你的环境变量PATH中已经包含了Hive的bin目录,你就可以在任何地方使用hive与-hiveconf参数。 如果没有添加Hive bin目录到PATH中,那么你需要进入到Hive的bin目录下,或者使用完整路径来执行hive命令。 可以先将Hive的bin目录添加到环境变量PATH中。

1-3  配置方式3:set命令

       1)是什么?

        在Hive CLI或Beeline中使用set命令,为set命令之后的所有SQL语句设置配置参数,这个也是会话级别的,也就是仅在当前会话内有效。

         这种方式也是用户日常开发中使用最多的一种配置参数方式。因为Hive倡导一种:谁需要、谁配置、谁使用的一种思想,避免你的属性修改影响其他用户的修改。

       2)怎么用?

     在Hive中,有两类set命令。

    第一类就是设置Hive配置参数的set命令,语法如下:

    SET key=value;

   --这个set命令将Hive配置项key的值设为value。

   例如: SET hive.exec.dynamic.partition.mode=nonstrict;

  --这个命令设置了Hive的动态分区模式为非严格模式。

  第二类就是查看Hive配置参数的set命令,语法如下:

  SET;

  SET key;

--第一个表示查看所有Hive配置信息,第二个则表示查看具体配置项key的值。

例如: SET hivevar:var_name=value;

            SET hivevar:var_name;

--上述命令可以分别用于设置Hive变量var_name的值为value,以及查看Hive变量var_name的值。

       3)注意事项

        1.使用 `SET key=value;` 命令修改的Hive配置参数只在当前会话有效,会话结束后,对Hive配置参数的修改也随之失效。如果需要做永久性的修改,应该在hive-site.xml文件中进行。

        2.配置方式的优先级顺序,优先级依次递增:

           set参数声明>hiveconf命令行参数>hive-site.xml配置文件。

           即set参数声明覆盖命令行参数hiveconf,命令行参数覆盖配置文件hive-site.xml设定。

           日常的开发使用中,如果不是核心的需要全局修改的参数属性,建议大家使用set命令进行设置。

二、函数的分类

2-1  内置函数和自定义函数

         Hive的函数包含了两大类,一类是内置函数,但是不见得一定可以满足于用户各种各样的分析需求场景。为了解决这个问题,Hive推出来第二类函数:用户自定义函数,让用户实现自己希望实现的功能函数。

         用户自定义函数简称UDF,源自于英文user-defined function。自定义函数总共有3类,是根据函数输入输出的行数来区分的,分别是:

        1)UDF(User-Defined-Function)普通函数,一进一出

        2)UDAF(User-Defined Aggregation Function)聚合函数,多进一出

        3)UDTF(User-Defined Table-Generating Functions)表生成函数,一进多出

       注意:但是这套UDF分类标准可以扩大到Hive的所有函数中:包括内置函数和自定义函数;下面的函数分类就按照这三类进行划分,不再区分内置函数和自定义函数

2-2  函数的类别

2-2-1    UDF 普通函数

                 

 2-2-2    UDAF 聚合函数

2-2-3    UDTF 表生成函数(重点)

           UDTF函数通常把它叫做表生成函数,最大的特点是一进多出,也就是输入一行输出多行

         之所以叫做表生成函数,原因在于这类型的函数作用返回的结果类似于表(多行数据嘛)。比如explode函数,它主要用于处理数组或map类型的数据,能将数组类型的列展开成多行,或者将map类型的列展开为两列(一个是key,一个是value)。

三、Hive函数的高阶用法

3-1   UDTF之explode函数

3-1-1  定义

          explode函数,中文戏称之为“爆炸函数”,可以炸开数据。

        接收map或者array类型的数据作为参数,然后把参数中的每个元素炸开变成一行数据。一个元素一行。这样的效果正好满足于输入一行输出多行。

        explode(array)将array列表里的每个元素生成一行;explode(map)将map里的每一对元素作为一行,其中key为一列,value为一列;

一般情况下,explode函数可以直接使用即可,也可以根据需要结合lateral view侧视图使用

         注意事项:

        `explode`是一种Hive SQL的表生成函数,它接受一个由数组或映射构成的列,然后将该列的每个元素生成为一个新行。所以,当你想对拆分后的字符串进行操作时,首先需要调用`split`函数来把字符串拆分成一个数组,然后可以对数组使用`explode`函数,不能直接对字符串类型的数据使用该函数。

      补充:split函数的用法

   `split` 函数用于将字符串按指定的分隔符拆分为数组。它接受两个参数:要拆分的字符串和用作分隔符的字符串。语法如下:

split(string str, string pat)

 假设你有这样的数据:

你可以这样使用 `split` 函数:

SELECT name, split(colors, ',') as color_array FROM persons;

结果会是:

在这个例子中,`split` 函数用逗号将 "colors" 列的值拆分成了一个数组。

3-1-2  用法

       例子1:拆分数组

      

       例子2:拆分映射

      我有一张表 the_nba_championship,里面有两个字段:team_name(NBA球队名称),champion_year(总冠军年份),现在想要把每个球队的每个总冠军年份都拆分成单独的一行,并且最好根据年份的倒序进行排序,怎么做?

表的内容如下:

 

         从上面的例子中可以看到,在select条件中,如果只有explode函数表达式,程序执行是没有任何问题的;但是如果在select条件中,包含explode和其他字段,就会报错,此时就必须结合侧视图才能正常查询。

       例子3:拆分字符串类型

        因为该函数只能针对数组和映射类型的数据进行拆分,所以需要先用split函数把字符串类型的数据变为数组

     select explode(split("a,b,c,d",","));

      

3-2  侧视图

3-2-1   定义

        Lateral View是一种特殊的语法,主要用于搭配UDTF类型功能的函数一起使用,用于解决UDTF函数的一些查询限制的问题。

        侧视图的原理是将UDTF的结果构建成一个类似于视图的表,然后将原表中的每一行和UDTF函数输出的每一行进行连接,生成一张新的虚拟表。这样就避免了UDTF的使用限制问题。使用lateral view时也可以对UDTF产生的记录设置字段名称,产生的字段可以用于group by、order by 、limit等语句中。

       一般只要使用UDTF,就会固定搭配lateral view使用。

3-2-2  语法

SELECT ... FROM table LATERAL VIEW explode(array_column) table_alias AS column_alias

在这个语法中,table是你要查询的表,array_column是包含数组或映射数据的列的名称,table_alias是你对侧视图的命名(或别名),column_alias是你对拆开的列的命名,如果拆开的列是数组类型的,通常只需要起一个别名就行,如果拆开的列是映射类型的,通常AS后面需要起2个别名,比如AS 别名1,别名2。

举个具体的例子:

  SELECT student.Name, subject FROM student LATERAL VIEW explode(student.Subjects) student AS subject;

--这个查询会把student表中的Subjects列拆分开,每一个Subjects里的元素都会被当作一个独立的行来处理,这样你就可以单独查询每一个subject了。

3-2-3  案例

案例1;使用explode函数+lateral view侧视图分解数组字段的案例

       假设你有一个名为 students 的表:

         CREATE TABLE students (name STRING, scores ARRAY<INT>);

        数据如下:

       INSERT INTO TABLE students SELECT 'John', array(85, 90, 95) FROM dual;

       INSERT INTO TABLE students SELECT 'Jane', array(90, 100, 85) FROM dual;

你想将 scores 分解为单独的行,可以使用 Lateral View 和 Explode 函数:

SELECT name, score FROM students LATERAL VIEW explode(scores) exploded_table AS score;

查询结果如下:

案例2:使用explode函数+lateral view侧视图分解映射字段的案例

       首先,假设我们有一个表`User_Preference`,里面存储了用户和他们的爱好映射字段:

       CREATE TABLE User_Preference ( user_id STRING, preference MAP<STRING, INT> );

    然后,我们向这个表中插入一些数据:

     INSERT INTO User_Preference SELECT 'User1', map('Basketball', 1, 'Football', 2, 'Tennis', 3) FROM DUAL;

    此时,如果我们想要获取每个用户的每个爱好及其相应的分数,就可以使用`LATERAL VIEW...EXPLODE`语法:

SELECT user_id, hobby, score FROM User_Preference LATERAL VIEW EXPLODE(preference) exploded_preference AS hobby, score;

运行上述查询后,会得到如下结果:

User1  Basketball   1

User1  Football    2

User1   Tennis    3

--  Hive中的`EXPLODE`函数将映射字段分解为多个行,并使用指定的别名(在本例中分别为`hobby`和`score`)来表示映射字段的键和值。

3-3 窗口函数

       看mysql里面的相关的内容即可。

3-4 抽样函数

       遇到了在看,不常用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值