一、Hive参数配置
Hive作为一款复杂的数据仓库软件,除了一些默认的属性行为之外,还支持用户配置属性进行修改,使得在某些场景下满足用户的需求。
作为用户端我们需要掌握两件事:
一是:Hive有哪些属性支持修改,修改了有什么功能;
二是:Hive支持哪种方式进行修改,修改是临时生效还是永久生效的。
1-1 配置方式1:hive-site.xml配置文件
问题1:hive的参数配置文件都有哪些?
Hive的参数配置文件主要有两个,分别是hive-site.xml和hive-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.xml和hiveserver2-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 抽样函数
遇到了在看,不常用。