当前位置: 首页 > news >正文

Hadoop-Hive

1. hive安装部署

2. hive基础

3. hive高级查询

4. Hive函数及性能优化

1.hive安装部署

解压tar -xvf ./apache-hive-3.1.2-bin.tar.gz -C /opt/soft/

改名mv apache-hive-3.1.2-bin/ hive312

配置环境变量:vim /etc/profile

#hive

export HIVE_HOME=/opt/soft/hive312

export PATH=$HIVE_HOME/bin:$PATH

更新环境变量:source /etc/profile

进入/opt/soft/hive312/conf

[root@kb129 lib]# pwd

拷贝MySQL8的连接驱动至/opt/soft/hive312/lib

修改配置文件:

(1)新建配置文件[root@kb129 conf]# vim ./hive-site.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration><!-- hdfs仓库路径 --><property><name>hive.metastore.warehouse.dir</name><value>/hive312/warehouse</value></property><!-- metastore元数据库类型 --><property><name>hive.metastore.db.type</name><value>mysql</value></property><!-- 连接MySQL字符串 --><property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://192.168.142.129:3306/hive129?createDatabaseIfNotExist=true</value></property><!-- mysql连接驱动 --><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.cj.jdbc.Driver</value><!-- mysql连接密码 --><property><name>javax.jdo.option.ConnectionPassword</name><value>123456</value></property><!-- 关闭schema验证 --><property><name>hive.metastore.schema.verification</name><value>false</value></property><!-- 打印当前库名 --><property><name>hive.cli.print.current.db</name><value>true</value></property><!-- 查询输出打印列名 --><property><name>hive.cli.print.header</name><value>true</value></property></configuration>

(2)删除hive中的guava-19.0.jar,将hadoop目录中的guava-27.0-jre.jar拷贝至hive312/lib目录下

cp /opt/soft/hadoop313/share/hadoop/common/lib/guava-27.0-jre.jar  /opt/soft/hive312/lib/

(3)hive初始化

[root@kb129 hive312]# schematool -dbType mysql -initSchema

(4)进入hive,创建数据库测试

[root@kb129 hive312]# hive

hive (default)> create database kb23DB

              > ;

OK

Time taken: 0.401 seconds

hive (default)> show databases;

OK

database_name

default

kb23db

Time taken: 0.082 seconds, Fetched: 2 row(s)

创建完成后HDFS系统中会生成

(注:hive如果关闭会进入异常模式,执行命令关闭:hdfs dfsadmin -safemode leave)

启动metastore元数据服务:[root@kb129 hive312]# nohup hive --service metastore &

启动hiveserver2远程服务:[root@kb129 hive312]# nohup hive --service hiveserver2 &

进入beeline客户端连接

使用datagrip连接

查找命令:查找当前目录下以gu开头的文件名

[root@kb129 lib]# find ./ -name gu*

./guava-19.0.jar

2.hive基础

2.1  hive

(1)基于Hadoop的数据仓库解决方案:

将结构化的数据文件映射为数据库表

提供类sql的查询语言HQL(Hive Query Language)

Hive让更多的人使用Hadoop

(2)Hive成为Apache顶级项目

Hive始于2007年的Facebook

官网:hive.apache.org

2.2  Hive的优势和特点

提供了一个简单的优化模型

HQL类SQL语法,简化MR开发

支持在不同的计算框架上运行

支持在HDFS和HBase上临时查询数据

支持用户自定义函数、格式

常用于ETL操作和BI

稳定可靠(真实生产环境)的批处理

有庞大活跃的社区

2.3  Hive元数据管理

(1)记录数据仓库中模型的定义、各层级间的映射关系

(2)存储在关系数据库中

1)默认Derby, 轻量级内嵌SQL数据库

Derby非常适合测试和演示

存储在.metastore_db目录中

2)实际生产一般存储在MySQL中

修改配置文件hive-site.xml

(3)HCatalog

将Hive元数据共享给其他应用程序

2.4  Hive操作-客户端交互模式

(1)检查Hive服务是否已经正常启动

(2)使用Hive交互方式(输入hive即可)

(3)使用beeline

1)需启动hiveserver2服务

nohup hive --service metastore &(非必须)

nohup hive --service hiveserver2 &

2)输入beeline进入beeline交互模式

!connect jdbc:hive2://kb129:10000

2.5Hive Interface – 其他使用环境

(1)Hive Web Interface

(2)Hue (Cloudera)

(3)Ambari Hive View (Hortonworks)

1)JDBC/ODBC(ETL工具,商业智能工具,集成开发环境)

2)Informatica, Talend

3)Tableau, QlikView, Zeppelin

4)Oracle SQL Developer, DB Visualizer等

2.6  Hive数据类型

- 基本数据类型

类似于SQL数据类型

类型

示例

类型

示例

TINYINT

10

SMALLINT

10

INT

10

BIGINT

100L

FLOAT

1.342

DOUBLE

1.234

DECIMAL

3.14

BINARY

1010

BOOLEAN

TRUE

STRING

'Book' or "Book"

CHAR

'YES' or "YES"

VARCHAR

'Book' or "Book"

DATE

'2013-01-31'

TIMESTAMP

'2020-01-31 00:13:00.345'

- 集合数据类型

ARRAY:存储的数据为相同类型

MAP:具有相同类型的键值对

STRUCT:封装了一组字段

类型

格式

定义

示例

ARRAY

['Apple','Orange','Mongo']

ARRAY<string>

a[0] = 'Apple'

MAP

{'A':'Apple','O':'Orange'}

MAP<string,string>

b['A'] = 'Apple'

STRUCT

{'Apple',2}

STRUCT<fruit:string,weight:int>

c.weight = 2

2.7  Hive数据结构

数据结构

描述

逻辑关系

物理存储(HDFS)

Database

数据库

表的集合

文件夹

Table

行数据的集合

文件夹

Partition

分区

用于分割数据

文件夹

Buckets

分桶

用于分布数据

文件

Row

行记录

文件中的行

Columns

列记录

每行中指定的位置

Views

视图

逻辑概念,可跨越多张表

不存储数据

Index

索引

记录统计数据信息

文件夹

2.8 数据库(Database)

(1)表的集合,HDFS中表现为一个文件夹

默认在hive.metastore.warehouse.dir属性目录下

(2)常用命令

查看细节:desc/describe database kb23db;

创建:create database aabb;

查看内容:show databases;

使用:use aabb;

查看当前使用的数据库:select current_database();

新增数据:insert into demo values(3,'wangwu');

覆写表格:insert overwrite table demo values(3,'wangwu');

删除:drop database [if exist] aabb;(非空数据库无法直接使用)

强制删除:drop database kb23db cascade;

查看日期:select `current_date`();

查看创建表/库的命令行细节:show create table/database demo;

更改表名:alter table demo2 rename to stu;

更改字段/列名:alter table stu change name uname string;

添加字段/列:alter table stu add columns(age int comment 'user_age');(comment注释)

添加多字段/列:alter table stu add columns(address string, email string);

替换字段/列(覆盖):alter table stu replace columns(id int, uname string, address string);

          

查看函数:show functions;

2.9 内部表

row format语法:DELIMITED关键字对 按照指定格式进行分割

ROW FORMAT

DELIMITED

[FIELDS TERMINATED BY char]

[COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char]

[LINES TERMINATED BY char]

[NULL DEFINED AS char](空位补值,默认为\N)

(1)创建内部表

create table student(

    id int,

    name string,

    hobbies array<string>,

    address map<string,string>

)

row format delimited fields terminated by ','

collection items terminated by '-'

map keys terminated by ':'

lines terminated by '\n';

(2)[root@kb129 kb23]# hdfs dfs -put ./student.txt /hive312/war

ehouse/kb23db.db/student

上传数据至表所属路径,执行select可以查询表内容

(3)加载hdfs数据:load data inpath '/kb23/hadoopstu/student.txt' into table student;

加载完数据后,hdfs原位置中文件转移到表中

加载centos本地数据:load data local inpath 'opt/kb23/student.txt'into table student;

(4)清空表数据

truncate table student;

(5)练习

employee文件

Michael|Montreal,Toronto|Male,30|DB:80|Product:DeveloperLead

Will|Montreal|Male,35|Perl:85|Product:Lead,Test:Lead

Shelley|New York|Female,27|Python:80|Test:Lead,COE:Architect

Lucy|Vancouver|Female,57|Sales:89,HR:94|Sales:Lead

转换成表:

create external table employee_external

(

    name         string,

    work_place   string,

    gender_age   struct<gender:string, age:int>,

    skills_score map<string,int>,

    depart_title map<string,array<string>>

)

    row format delimited fields terminated by '|'

        collection items terminated by ','

        map keys terminated by ':'

        lines terminated by '\n'

location '/kb23/hadoopstu/employeefile';

2.10   分区表

(1)关键字:partitioned by(age int)

(2)导入数据时添加年龄放置20分区:load data local inpath '/opt/kb23/student.txt'into table student2 partition (age=20);

(3)查看有多少分区字段:show partitions student2;

 

hdfs分区显示:

(4)添加分区:alter table student3 add partition (age = 10, gender = 'man');

  1. 删除分区:alter table student3 drop partition (age = 10, gender = 'man');

2.11  动态分区

-- 开启动态分区

set hive.exec.dynamic.partition=true;

-- 默认是strict

set hive.exec.dynamic.partition.mode=nonstrict;

插入数据后实现自动分区insert into studenttp1 partition (age, gender)  select id,name,hobbies,address,age,gender from studenttp;

2.12  外部表(hdfs中查看不到表,删除外部表不会删除location的文件数据)

create external table student_external

(

    id      int,

    name    string,

    hobbies array<string>,

    address map<string,string>

)

    row format delimited fields terminated by ','

    collection items terminated by '-'

    map keys terminated by ':'

    lines terminated by '\n'

location '/kb23/hadoopstu/stufile';

2.13  临时表(当前会话内有效,数据库资源不显示)

临时表是应用程序自动管理在复杂查询期间生成的中间数据的方法

表只对当前session有效,session退出后自动删除

表空间位于/tmp/hive-<user_name>(安全考虑)

如果创建的临时表表名已存在,实际用的是临时表

create temporary table tmp_employee as select name,work_place from employee_external;

2.14  查询

(1)查询字段属性为struct的内容

select * from employee_external where gender_age.gender = 'Female';

(2)多条件查询

select * from employee_external where name = 'Will'

union

select * from employee_external where gender_age.gender = 'Male'

union

select * from employee_external where gender_age.gender = 'Female';

create temporary table ctas_employee as

with r1 as (select * from employee_external where name = 'Will'),

     r2 as (select * from employee_external where gender_age.gender = 'Male'),

     r3 as (select * from employee_external where gender_age.gender = 'Female')

select * from r1 union select * from r2 union select * from r3;

(3)查询表的详情

desc formatted student3;

2.15  Hive建表

- 分隔符

Hive中默认分隔符

字段:^A(\001)

集合:^B(\002)

映射:^C(\003)

在hive中建表时可以指定分割符

-- 指定列分隔符语法

ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'

- Storage SerDe

(1)SerDe:Serializer and Deserializer

(2)Hive支持不同类型的Storage SerDe

LazySimpleSerDe: TEXTFILE

BinarySerializerDeserializer:  SEQUENCEFILE

ColumnarSerDe: ORC, RCFILE

ParquetHiveSerDe: PARQUET

AvroSerDe: AVRO

OpenCSVSerDe: for CST/TSV

JSONSerDe

RegExSerDe

HBaseSerDe 

Hive建表高阶语句 - CTAS and WITH

(1)CTAS – as select方式建表

CREATE TABLE ctas_employee as SELECT * FROM employee;

CTAS不能创建partition, external, bucket table

(2)CTE (CTAS with Common Table Expression)

CREATE TABLE cte_employee AS

WITH

r1 AS  (SELECT name FROM r2 WHERE name = 'Michael'),

r2 AS  (SELECT name FROM employee WHERE sex_age.sex= 'Male'),

r3 AS  (SELECT name FROM employee  WHERE sex_age.sex= 'Female')

SELECT * FROM r1 UNION ALL SELECT * FROM r3;

(3)like只创建employee结构,并没有数据

CREATE TABLE employee_like LIKE employee;

2.16  分桶(Bucket)

分桶对应于HDFS中的文件

更高的查询处理效率

使抽样(sampling)更高效

一般根据"桶列"的哈希函数将数据进行分桶

分桶只有动态分桶

SET hive.enforce.bucketing = true;

定义分桶

CLUSTERED BY (employee_id) INTO 2 BUCKETS

必须使用INSERT方式加载数据

-- 创建分桶表

create table employee_id_buckets (

    name string,

    employee_id int,

    work_place array <string>,

    gender_age struct<gender:string, age:int>,

    skills_score map<string, int>,

    depart_title map<string, array<string>>

)

clustered by (employee_id) into 2 BUCKETS

row format delimited fields terminated by '|'

    collection items terminated by ','

    map keys terminated by ':'

    lines terminated by '\n';

select * from employee_id_buckets;

set map.reduce.tasks=2;

set hive.enforce.bucketing=true;

insert overwrite table employee_id_buckets select * from employee_id;

2.17   分桶抽样(Sampling)

随机抽样基于整行数据

随机条数据:select * from employee_id_buckets tablesample ( bucket 3 out of 16 on rand())s;

指定从16个桶中选择第3个桶的数据,并且使用随机的方式进行采样。

随机4条数据:select * from employee_id_buckets tablesample ( 4 rows )s;

随机20%数据:select * from employee_id_buckets tablesample ( 20 percent )s;

随机抽样基于指定列(使用分桶列更高效)

    SELECT * FROM table_name TABLESAMPLE(BUCKET 3 OUT OF 32 ON id) s;

2.18  Hive视图(View)

(1)视图概述

通过隐藏子查询、连接和函数来简化查询的逻辑结构

只保存定义,不存储数据

如果删除或更改基础表,则查询视图将失败

视图是只读的,不能插入或装载数据

(2)应用场景

将特定的列提供给用户,保护数据隐私

用于查询语句复杂的场景

(3)视图操作命令

CREATE、SHOW、DROP、ALTER

-- 创建视图,支持 CTE, ORDER BY, LIMIT, JOIN,等

CREATE VIEW view_name AS SELECT statement;

-- 查找视图 (SHOW VIEWS 在 hive v2.2.0之后)

SHOW TABLES;

-- 查看视图定义

SHOW CREATE TABLE view_name;

-- 删除视图

DROP view_name;

--更改视图属性

ALTER VIEW view_name SET TBLPROPERTIES ('comment' = 'This is a view');

-- 更改视图定义,

ALTER VIEW view_name AS SELECT statement;

create view employee_id_view as select name, work_place from employee_id_buckets;

select * from employee_id_view;

2.19  Hive侧视图(Lateral View)

(1)与表生成函数结合使用,将函数的输入和输出连接

(2)OUTER关键字:即使output为空也会生成结果

select name,work_place,loc from employee lateral view outer explode(split(null,',')) a as loc;

(3)支持多层级

select name,wps,skill,score from employee

lateral view explode(work_place) work_place_single as wps

lateral view explode(skills_score) sks as skill,score;

(4)通常用于规范化行或解析JSON

3.hive高级查询

3.1  WordCount

(1)创建表,加载数据

create table docs(line string);

load data local inpath '/opt/kb23/docs.txt' into table docs;

(2)查询

with

    t1 as ( select explode(split(line, ' ')) as word from docs )

select word, count(1) from t1 group by word order by word;

3.3  case when用法

select name, gender,

       case

           when gender = 'boy' then 1

           else 0 end as male,

       case

           when gender = 'girl' then 1

           else 0 end as female

from studenttp;

3.4  collect_set()去重集合,collect_list()列表

with

    t1 as(select name, gender,

            case when gender = 'boy' then 1 else 0 end as male,

            case when gender = 'girl' then 1 else 0 end as female,

            case when gender = 'girl' or gender = 'boy' then 1 else 0 end as tag

        from studenttp)

select collect_set(gender) colset,collect_list(gender) collist from t1 group by tag;

3.5  concat()和concat_ws()用法

with

    t1 as(select name, gender,

            case when gender = 'boy' then 1 else 0 end as male,

            case when gender = 'girl' then 1 else 0 end as female,

            case when gender = 'girl' or gender = 'boy' then 1 else 0 end as tag

        from studenttp),

    t2 as(select collect_set(gender) colset,collect_list(gender) collist from t1 group by tag)

select concat_ws(',',colset),concat_ws(',',collist) from t2;

3.6  综合练习:找出每位用户没有安装的app

(1)找出有哪些用户(分组去重)

select name from userapp group by name;

(2)笛卡尔积

select a.id, a.name, u.name uname from app a cross join (select name from userapp group by name) u;

(3)合并查询

with

    usertb as (select name from userapp group by name),

    userapp1 as (select a.id ,a.name , u.name uname from app as a cross join usertb as u),

    userapp2 as (select u1.name appname ,u1.uname from userapp1 u1 left join userapp u

    on u1.name=u.appname and u1.uname=u.name where u.name is null)

select uname, concat_ws("," ,collect_set(appname)) from userapp2 group by uname;

3.7  窗口函数

- 概述

(1)窗口函数是一组特殊函数

扫描多个输入行来计算每个输出值,为每行数据生成一行结果

可以通过窗口函数来实现复杂的计算和聚合

(2)语法

Function (arg1,..., arg n) OVER ([PARTITION BY <...>] [ORDER BY <....>] [<window_clause>])

PARTITION BY类似于GROUP BY,未指定则按整个结果集

只有指定ORDER BY子句之后才能进行窗口定义

可同时使用多个窗口函数

过滤窗口函数计算结果必须在外面一层

(3)按功能可划分为:排序,聚合,分析

- 排序

ROW_NUMBER()

对所有数值输出不同的序号,序号唯一连续

RANK()

对相同数值,输出相同的序号,下一个序号跳过(1,1,3)

DENSE_RANK()

对相同数值,输出相同的序号,下一个序号连续(1,1,2)

NLITE(n)切n片

将有序的数据集合平均分配到n个桶中, 将桶号分配给每一行,根据桶号,选取前或后 n分之几的数据

PERCENT_RANK()分区内数据压到0-1区间

(目前排名- 1)/(总行数- 1),值相对于一组值的百分比排名

- 聚合

COUNT()

计数,可以和DISTINCT一起用

SUM():求和

AVG():平均值

MAX()/MIN(): 最大/小值

从Hive 2.1.0开始在OVER子句中支持聚合函数

- 分析

CUME_DIST

小于等于当前值的行数/分组内总行数

LEAD/LAG(col,n)

某一列进行往前/后第n行值(n可选,默认为1)

FIRST_VALUE

对该列到目前为止的首个值

LAST_VALUE

到目前行为止的最后一个值

- 窗口定义-1

(1)窗口定义由[<window_clause>]子句描述

用于进一步细分结果并应用分析函数

(2)支持两类窗口定义

行类型窗口

范围类型窗口

(3)RANK、NTILE、DENSE_RANK、CUME_DIST、PERCENT_RANK、LEAD、LAG和ROW_NUMBER函数不支持与窗口子句一起使用

- 窗口定义-2

(1)行窗口:根据当前行之前或之后的行号确定的窗口

ROWS BETWEEN <start_expr> AND <end_expr>

(2)<start_expr>可以为下列值

UNBOUNDED PRECEDING : 窗口起始位置(分组第一行)

CURRENT ROW:当前行

N PRECEDING/FOLLOWING:当前行之前/之后n行

(3)<end_expr>可以为下列值

UNBOUNDED FOLLOWING :  窗口结束位置(分组最后一行)

CURRENT ROW:当前行

N PRECEDING/FOLLOWING:当前行之前/之后n行

- 窗口定义-3

范围窗口是取分组内的值在指定范围区间内的行

该范围值/区间必须是数字或日期类型

目前只支持一个ORDER BY列

设置本地模式:set mapred.framework.name=local;

4. Hive函数及性能优化

4.1  Hive函数分类

(1)从输入输出角度分类

标准函数:一行数据中的一列或多列为输入,结果为单一值

聚合函数:多行的零列到多列为输入,结果为单一值

表生成函数:零个或多个输入,结果为多列或多行

(2)从实现方式分类

内置函数

自定义函数

UDF:自定义标准函数

UDAF:自定义聚合函数

UDTF:自定义表生成函数

4.2  内置函数

(1)Hive提供大量内置函数供开发者使用

标准函数:字符函数、类型转换函数、数学函数、日期函数、集合函数、条件函数

聚合函数

表生成函数

4.3   字符函数

返回值

函数

描述

string

concat(string|binary A, string|binary B...)

对二进制字节码或字符串按次序进行拼接

int

instr(string str, string substr)

查找字符串str中子字符串substr出现的位置

int

length(string A)

返回字符串的长度

int

locate(string substr, string str[, int pos])

查找字符串str中的pos位置后字符串substr第一次出现的位置

string

lower(string A) /upper(string A)

将字符串A的所有字母转换成小写/大写字母

string

regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)

按正则表达式PATTERN将字符串中符合条件的部分替换成REPLACEMENT所指定的字符串

array

split(string str, string pat)

按照正则表达式pat来分割字符串str

string

substr(string|binary A, int start, int len)

substring(string|binary A, int start, int len)

对字符串A,从start位置开始截取长度为len的字符串并返回

string

trim(string A)

将字符串A前后出现的空格去掉

map

str_to_map(text[, delimiter1, delimiter2])

将字符串str按照指定分隔符转换成Map

binary

encode(string src, string charset)

用指定字符集charset将字符串编码成二进制值

4.4   类型转换函数和数学函数

返回值

类型转换函数

描述

"type"

cast(expr as <type>)

将expr转换成type类型 如:cast("1" as BIGINT) 将字符串1转换成了BIGINT类型

binary

binary(string|binary)

将输入的值转换成二进制

返回值

数学函数

描述

DOUBLE

round(DOUBLE a)

返回对a四舍五入的BIGINT值

binary

round(DOUBLE a, INT d)

返回对a四舍五入并保留d位小数位的值

BIGINT

floor(DOUBLE a)

向下取整,如:6.10->6   -3.4->-4

DOUBLE

rand(INT seed)

返回一个DOUBLE型随机数,seed是随机因子

DOUBLE

power(DOUBLE a, DOUBLE p)

计算a的p次幂

DOUBLE

abs(DOUBLE a)

计算a的绝对值

4.5  日期函数

返回值

函数

描述

string

from_unixtime(bigint unixtime[, string format])

将时间戳转换成format格式

int

unix_timestamp()

获取本地时区下的时间戳

bigint

unix_timestamp(string date)

将格式为yyyy-MM-dd HH:mm:ss的时间字符串转换成时间戳

string

to_date(string timestamp)

返回时间字符串的日期部分

int

year(string date),类似的有:

month/day/hour/minute/second/weekofyear

返回时间字符串的年份部分

返回月/天/时/分/秒/第几周

int

datediff(string enddate, string startdate)

计算开始时间到结束时间相差的天数

string

date_add(string startdate, int days)

从开始时间startdate加上days

string

date_sub(string startdate, int days)

从开始时间startdate减去days

date

current_date

返回当前时间的日期

timestamp

current_timestamp

返回当前时间戳

string

date_format(date/timestamp/string ts, string fmt)

按指定格式返回时间date 如:date_format("2016-06-22","MM-dd")=06-22

             

4.6   集合函数

返回值

函数

描述

int

size(Map<K.V>)

返回map中键值对个数

int

size(Array<T>)

返回数组的长度

array<K>

map_keys(Map<K.V>)

返回map中的所有key

array<V>

map_values(Map<K.V>)

返回map中的所有value

boolean

array_contains(Array<T>, value)

如该数组Array<T>包含value返回true。,否则返回false

array

sort_array(Array<T>)

对数组进行排序

4.7   条件函数

返回值

函数

描述

T

if(boolean testCondition, T valueTrue, T valueFalseOrNull)

如果testCondition 为true就返回valueTrue,否则返回valueFalseOrNull

T

nvl(T value, T default_value)

value为NULL返回default_value,否则返回value

T

COALESCE(T v1, T v2, ...)

返回第一非null的值,如果全部都为NULL就返回NULL

T

CASE a WHEN b THEN c

[WHEN d THEN e]* [ELSE f] END

如果a=b就返回c,a=d就返回e,否则返回f

T

CASE WHEN a THEN b

[WHEN c THEN d]* [ELSE e] END

如果a=ture就返回b,c= ture就返回d,否则返回e

boolean

isnull( a )

如果a为null就返回true,否则返回false

boolean

isnotnull ( a )

如果a为非null就返回true,否则返回false

4.8   聚合函数和表生成函数

(1)聚合函数

count、sum、max、min、avg、var_samp等

(2)表生成函数:输出可以作为表使用

返回值

函数

描述

N rows

explode(array<T>)

对于array中的每个元素生成一行且包含该元素

N rows

explode(MAP)

每行对应每个map键值对

其中一个字段是map的键,另一个字段是map的值

N rows

posexplode(ARRAY)

与explode类似,不同的是还返回各元素在数组中的位置

N rows

stack(INT n, v_1, v_2, ..., v_k)

把k列转换成n行,每行有k/n个字段,其中n必须是常数

tuple

json_tuple(jsonStr, k1, k2, ...)

从一个JSON字符串中获取多个键并作为一个元组返回,与get_json_object不同的是此函数能一次获取多个键值

4.9   Hive UDF开发流程

继承UDF类或GenericUDF类

重写evaluate()方法并实现函数逻辑

编译打包为jar文件

复制到正确的HDFS路径

使用jar创建临时/永久函数

调用函数

4.10  Hive UDF实现

Java IDE, JDK, Maven

继承UDF并重写evaluate()方法

演示:实现以下自定义函数

string_lower(letter) = LETTER

编译、测试和打包jar文件,上传jar并调用函数

上传[root@kb129 kb23]# hdfs dfs -put ./hive_udf-1.0-SNAPSHOT.jar /kb23

Hive优化参考hive优化大全-一篇就够了_hive 优化_GOD_WAR的博客-CSDN博客

Hive常见set的配置设置https://blog.csdn.net/sweet19920711/article/details/117930785 

Hive窗口函数参考Hive:窗口函数_hive窗口函数_花和尚也有春天的博客-CSDN博客

相关文章:

Hadoop-Hive

1. hive安装部署 2. hive基础 3. hive高级查询 4. Hive函数及性能优化 1.hive安装部署 解压tar -xvf ./apache-hive-3.1.2-bin.tar.gz -C /opt/soft/ 改名mv apache-hive-3.1.2-bin/ hive312 配置环境变量&#xff1a;vim /etc/profile #hive export HIVE_HOME/opt/soft/hive…...

竞赛 基于机器视觉的火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器视觉的火车票识别系统 该项目较为新颖&#xff0c;适合作为竞赛…...

conda与pip镜像源环境配置

文章目录 一. 参考二. conda三. pip 一. 参考 b站环境配置视频 校园网镜像站 二. conda 利用校园网镜像站, 找到conda的镜像源配置文档. 将下面的文档复制到电脑上的.condarc文件中. channels:- defaults show_channel_urls: true default_channels:- https://mirrors.tuna…...

Golang1.21更新内容全面介绍~

我的掘金平台原文地址Golang1.21更新内容全面介绍~ 前言 在Golang1.21这一次更新中&#xff0c;主要更新内容为&#xff1a; for range的一个语义变更 、 新加入max、min、clear方法、 contenxt增添api、 WASI的支持 本文主要带大家熟悉这些变更的内容~ 1.for语义的变更…...

ArcGIS 10.4安装教程!

软件介绍&#xff1a;ArcGIS是一款专业的电子地图信息编辑和开发软件&#xff0c;提供一种快速并且使用简单的方式浏览地理信息&#xff0c;无论是2D还是3D的信息。软件内置多种编辑工具&#xff0c;可以轻松的完成地图生产全过程&#xff0c;为地图分析和处理提供了新的解决方…...

华为云云服务器云耀L实例评测 | 从零开始:华为云云服务器L实例使用教程

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

ElasticSearch配置

2) 搭建ElasticSearch环境 2.1) 拉取镜像 docker pull elasticsearch:7.4.02.2) 创建容器 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.…...

MySQL优化第二篇

MySQL优化第二篇 性能分析小表驱动大表慢查询日志日志分析工具mysqldumpslow Show Profile进行SQL分析&#xff08;重中之重&#xff09; 七种JOIN 1、inner join &#xff1a;可以简写为join&#xff0c;表示的是交集&#xff0c;也就是两张表的共同数据 sql语句&#xff1a…...

基于python解决鸡兔同笼问题

一、什么是鸡兔同笼问题&#xff1f; 鸡兔同笼问题是一个经典的数学问题。问题描述&#xff1a;鸡和兔子共有头数a和脚数b&#xff0c;求鸡和兔子的数量。 解析&#xff1a;设鸡的数量为x&#xff0c;兔子的数量为y&#xff0c;那么可以得到以下两个方程&#xff1a; 1. x y…...

2023 Google 开发者大会|Mobile开发专题追踪

文章目录 前言大会介绍涉及内容MobileWebAICloud Mobile开发专题多终端应用的开发适配大屏视频流可穿戴设备电视新的设计中心 构建高质量的应用高级相机和媒体功能用户的安全和隐私更精细的视觉体验 小结 前言 哈喽大家好&#xff0c;我是阿Q。近期&#xff0c;【2023 Google …...

最新版WPS 2023 加载Zotero方法

安装wps2019vba.exe&#xff0c;获取链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1eeoc6Tmwyzxh3n1MFQTVeA 提取码&#xff1a;6431 –来自百度网盘超级会员V8的分享 打开WPS的工具的加载项 添加文件路径&#xff0c;我的在&#xff1a; C:\Users\Administrat…...

详解爬虫策略,反爬虫策略,反反爬爬虫策略

爬虫策略 爬取策略是网络爬虫在执行网页抓取任务时所遵循的规则或策略。这些策略决定了爬虫如何从一个页面转到另一个页面&#xff0c;什么时间进行抓取&#xff0c;以及应该抓取哪些内容。以下是几种常见的爬取策略&#xff1a; 深度优先搜索&#xff08;DFS&#xff09; 在…...

ES6中的Promise对象

1. Promise是什么 Promise简单来说就是一个容器&#xff0c;里面保存着未来才会结束的事件的结果&#xff08;这个事件就是异步操作&#xff09;。Promise是一个对象&#xff08;构造函数&#xff09;&#xff0c;可以获取异步操作的结果。 特点&#xff1a; 对象的状态不受外…...

vue 知识点———— 生命周期

1.什么是生命周期 Vue实例从创建到销毁的过程&#xff0c;叫生命周期。 从开始创建、初始化数据、编译模版、挂载Dom-渲染、更新-渲染、销毁等过程。 2.生命周期一共有几个阶段 创建前/后, 载入前/后,更新前/后,销毁前/销毁后 3.初始化相关属性 beforeCreate&#xff08;创建前…...

焊接符号学习

欧美焊接符号举例 4.5------表示焊点直径 【3】------根据图示说明&#xff0c;表示此项为CC项或者SC项 6-------表示此处为第六CC项或者SC项 BETWEEN①AND②------表示①件和②件俩点之间的焊点 12X------表示俩点之间的焊点个数为12个 日本焊接符号举例 A------根据图示&…...

记录linux清理空间的步骤

sudo du -sh /* 看整体空间占用情况 [roothost ~]# sudo du -sh /* 0 /bin 143M /boot 85M /data 0 /dev 38M /etc 4.0K /home 0 /lib 0 /lib64 16K /lostfound 4.0K /media 4.0K /mnt 31M /opt 0 /proc 260K /r…...

丰田工厂停产竟然因为磁盘...

丰田因磁盘空间不足关闭14家工厂 在如今的信息时代&#xff0c;无论是生活还是工作&#xff0c;我们都离不开计算机和网络。然而&#xff0c;令人惊讶的是&#xff0c;一家全球知名的汽车制造商——丰田&#xff0c;却因为磁盘空间不足的问题&#xff0c;被迫关闭了14家工厂。…...

Python工程师Java之路(p)Maven聚合和继承

文章目录 依赖管理依赖传递可选依赖和排除依赖 继承与聚合 依赖管理 指当前项目运行所需的jar&#xff0c;一个项目可以设置多个依赖 <!-- 设置当前项目所依赖的所有jar --> <dependencies><!-- 设置具体的依赖 --><dependency><!-- 依赖所属群组…...

Java 复习笔记 - Lambda 表达式 he 经典算法题

文章目录 Lambda表达式 概述&#xff08;一&#xff09;基本作用&#xff08;二&#xff09;特点 一&#xff0c;初识Java中的Lambda 表达式二&#xff0c;函数式编程三&#xff0c;省略写法四&#xff0c;练习&#xff1a;使用Lambda 表达式 简化Comparator接口的匿名形式综合…...

算法——快乐数

202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 由图可知&#xff0c;其实这也是一个判断循环的过程&#xff0c;要用到快慢指针&#xff0c;且相遇后&#xff0c;若在全为1的循环里&#xff0c;那么就是快乐数&#xff0c;若相遇后不为1&#xff0c;说明这不是快乐数。 …...

vue使用window.location.href 跳转失败

问题&#xff1a; vue项目中直接使用window.lcocation.href跳转外链&#xff0c;但是跳转的链接会被拼接成这样 http://localhost:8080/#/www.baidu.com 原因&#xff1a; 我们打开的外部链接会自动拼接我们的源地址&#xff0c;导致网址链接不正确&#xff0c;无法正常访问 …...

【备忘】清理Office缓存

【背景】电脑安装了M365 Apps for enterprise的客户端&#xff0c;遇到不常见的奇怪问题。尝试看清理缓存是否可以解决。 【清理步骤】 1. 关闭所有Office365 应用&#xff1b; 2. 搜索 %AppData% &#xff0c;并打开该文件夹&#xff1b; 3. 进到 AppData > Local > M…...

MacOS环境变量source生效但重启后又失效

https://blog.csdn.net/dxk539687357/article/details/127942044 .bash_profile 和 .zshrc 都是macos系统重环境变量配置的文件&#xff0c;但是两者有不同之处。 .bash_profile&#xff1a;在执行source ~/.bash_profile&#xff0c;只在当前窗口生效&#xff0c;但关闭当前…...

Sql语句大全--插入

今天抽空整理下项目中的Sql语句 项目中用到的Sql语句大全 Insert 语句&#xff0c;有简有难 Insert 语句&#xff0c;有简有难 insert into clayor (pco,ppolnum,ptype,psn,prela,pname,pid,paddr1,paddr2,pbakcod1,pbakcod2,paccnum,pchkflag,pagtcod,pstatus, pchksts,pauth…...

Unity 收取“运行费”引众怒,开源免费3D游戏引擎CGE(Castle Game Engine)吸引开发者关注

特征 1. 总结2. 跨平台3. 可视化编辑器4.视口与场景&#xff0c;相机&#xff0c;导航和其他组件5. 数据格式 5.1. glTF5.2. X3D5.3. 精灵表5.4. 脊柱6. 图形效果7. 图片8. 用户界面组件 8.1. 文本和字体9. 网络10. 优化和分析11. 声音12. 物理13. 平铺集成14. 粒子15. 使用现代…...

Apache DolphinScheduler - 快速扩展 TaskPlugin 从入门到放弃

目前在大数据生态中&#xff0c;调度系统是不可或缺的一个重要组件。Apache DolphinScheduler 作为一个顶级的 Apache 项目&#xff0c;其稳定性和易用性也可以说是名列前茅的。而对于一个调度系统来说&#xff0c;能够支持的可调度的任务类型同样是一个非常重要的因素&#xf…...

线性代数的本质(四)——行列式

文章目录 行列式二阶行列式 n n n 阶行列式行列式的性质克拉默法则行列式的几何理解 行列式 二阶行列式 行列式引自对线性方程组的求解。考虑两个方程的二元线性方程组 { a 11 x 1 a 12 x 2 b 1 a 21 x 1 a 22 x 2 b 2 \begin{cases} a_{11}x_1a_{12}x_2b_1 \\ a_{21}x_…...

适合初学者快速入门的Numpy实战全集

适合初学者快速入门的Numpy实战全集 Numpy是一个用python实现的科学计算的扩展程序库&#xff0c;包括&#xff1a; 1、一个强大的N维数组对象Array&#xff1b;2、比较成熟的&#xff08;广播&#xff09;函数库&#xff1b;3、用于整合C/C和Fortran代码的工具包&#xff1b…...

rabbitmq 面试题

1.交换机类型 RabbitMQ是一个开源的消息队列系统&#xff0c;它支持多种交换机类型&#xff0c;用于在消息的生产者和消费者之间路由和分发消息 Direct Exchange&#xff08;直接交换机&#xff09;&#xff1a;Direct交换机是最简单的交换机类型之一。它将消息按照消息的Rout…...

比较Visual Studio Code中的文件

目录 一、比较两个文件 1.1VS code中的文件大致分为两类&#xff1a; 1.2如何比较VS code中的两个文件&#xff1f; 二、并排差异模式&#xff1a;VS code中的一种差异模式 三、内联差异模式&#xff1a;VS code中的另一种差异模式 四、VS code忽略在行首或者行尾添加或删除…...

滨湖网站制作/下载百度官方网站

在python的标准库ftplib中&#xff0c;FTP类提供了一个dir()函数&#xff0c;可以检索出当前路径下文件列表和这些文件有关的信息并打印出来&#xff0c;但是这个函数并没有返回值&#xff0c;只有打印的功能FTP类还提供另一个nlst()函数&#xff0c;与dir()函数类似&#xff0…...

电子商务网站推广主要方式/whois查询 站长工具

简介: 最近小编去网上注册某个论坛账号的时候,注册的时候居然要输入邮箱账号用来激活账号,但是我需要的资料却只有这个论坛才有,但是我只是这次找我需要的资料,以后可能都不会登陆这个网站了,实在是不想泄漏自己的邮箱账号,毕竟这是个人隐私,所以我特地上网找下有没有在线接收邮…...

东莞seoseo优化排名/seo常用工具

之前写某些代码的时候&#xff0c;发现用户莫名奇妙地阻塞了&#xff0c;而且这种阻塞的情况还比较难以形容&#xff1a; 使用session过程中&#xff0c;在开启session后&#xff0c;同一浏览器&#xff0c;执行同一程序&#xff0c;不同页面会被锁。不同浏览器不会出现这种情况…...

阿里云 个人网站备案/谷歌浏览器安卓下载

简析-commonJS&AMD&CMD 大概说下三者区别: 历史流水线&#xff1a; CommonJS ---> AMD ---> CMD 共同点&#xff1a; 都是使用字符串命名方式&#xff0c;让模块作用域只存在于当前模块作用域内&#xff0c;解决了命名空间的问题&#xff0c;且遵循一个模块代表一…...

2022最新泛站群程序/中文域名注册官网入口

Python科学计算 Preface 1 软件包的安装和介绍 1.1 Python简介 1.2 安装软件包 1.2.1 Python(x,y) 1.2.2 Enthought Python Distribution(EPD) 1.3 方便的开发工具 1.3.1 IPython 1.3.2 Spyder 1.3.3 Wing IDE 101 1.4 函数库介绍 1.4.1 数值计算库 1.4.2 符号计算库 1.4.3 界面…...

如何让订阅号菜单做微网站/搜什么关键词能找到网站

项目地址&#xff1a;http://www.freeteam.cn/密码设置从右侧管理菜单点击密码设置进入。输入正确的当前密码和新密码后点击修改即可。转载于:https://blog.51cto.com/3357346/2322921...