hive的高级操作(代码片段)

dll102 dll102     2023-05-03     495

关键词:

二、视图

1、Hive 的视图和关系型数据库的视图区别

和关系型数据库一样,Hive 也提供了视图的功能,不过请注意,Hive 的视图和关系型数据库的数据还是有很大的区别:

  (1)只有逻辑视图,没有物化视图;

  (2)视图只能查询,不能 Load/Insert/Update/Delete 数据;

  (3)视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的 那些子查询

2、Hive视图的创建语句

create view view_cdt as select * from cdt;

技术图片

3、Hive视图的查看语句

show views;
desc view_cdt;-- 查看某个具体视图的信息

技术图片

4、Hive视图的使用语句

select * from view_cdt;

技术图片

5、Hive视图的删除语句

drop view view_cdt;

技术图片

 

三、函数

1、内置函数

具体可看http://www.cnblogs.com/qingyunzong/p/8744593.html

(1)查看内置函数

show functions;

技术图片

(2)显示函数的详细信息

desc function substr;

技术图片

(3)显示函数的扩展信息

desc function extended substr;

技术图片

2、自定义函数UDF

当 Hive 提供的内置函数无法满足业务处理需要时,此时就可以考虑使用用户自定义函数。

UDF(user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数,字 符串函数)

UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多个输入数据行,并产 生一个输出数据行。(count,max)

UDTF(表格生成函数 User-Defined Table Functions):接收一行输入,输出多行(explode)

(1) 简单UDF示例

A. 导入hive需要的jar包,自定义一个java类继承UDF,重载 evaluate 方法

ToLowerCase.java

技术图片
import org.apache.hadoop.hive.ql.exec.UDF;

public class ToLowerCase extends UDF
    
    // 必须是 public,并且 evaluate 方法可以重载
    public String evaluate(String field) 
    String result = field.toLowerCase();
    return result;
    
    
技术图片

B. 打成 jar 包上传到服务器

C. 将 jar 包添加到 hive 的 classpath

add JAR /home/hadoop/udf.jar;

技术图片

D. 创建临时函数与开发好的 class 关联起来

0: jdbc:hive2://hadoop3:10000> create temporary function tolowercase as ‘com.study.hive.udf.ToLowerCase‘;

技术图片

E. 至此,便可以在 hql 在使用自定义的函数

0: jdbc:hive2://hadoop3:10000> select tolowercase(‘HELLO‘);

技术图片

(2) JSON数据解析UDF开发

现有原始 json 数据(rating.json)如下

"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"

"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"

"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"

"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"

"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"

"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"

"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"

"movie":"2804","rate":"5","timeStamp":"978300719","uid":"1"

"movie":"594","rate":"4","timeStamp":"978302268","uid":"1"

现在需要将数据导入到 hive 仓库中,并且最终要得到这么一个结果:

技术图片

该怎么做、???(提示:可用内置 get_json_object 或者自定义函数完成)

A. get_json_object(string json_string, string path)

返回值: string  

说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。  这个函数每次只能返回一个数据项。

0: jdbc:hive2://hadoop3:10000> select get_json_object(‘"movie":"594","rate":"4","timeStamp":"978302268","uid":"1"‘,‘$.movie‘);

技术图片

创建json表并将数据导入进去

0: jdbc:hive2://hadoop3:10000> create table json(data string);
No rows affected (0.983 seconds)
0: jdbc:hive2://hadoop3:10000> load data local inpath ‘/home/hadoop/json.txt‘ into table json;
No rows affected (1.046 seconds)
0: jdbc:hive2://hadoop3:10000> 

 技术图片

0: jdbc:hive2://hadoop3:10000> select 
. . . . . . . . . . . . . . .> get_json_object(data,‘$.movie‘) as movie 
. . . . . . . . . . . . . . .> from json;

技术图片

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

参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比 get_json_object 高效,因为可以在一次调用中输入多个键

技术图片
0: jdbc:hive2://hadoop3:10000> select 
. . . . . . . . . . . . . . .>   b.b_movie,
. . . . . . . . . . . . . . .>   b.b_rate,
. . . . . . . . . . . . . . .>   b.b_timeStamp,
. . . . . . . . . . . . . . .>   b.b_uid   
. . . . . . . . . . . . . . .> from json a 
. . . . . . . . . . . . . . .> lateral view json_tuple(a.data,‘movie‘,‘rate‘,‘timeStamp‘,‘uid‘) b as b_movie,b_rate,b_timeStamp,b_uid;
技术图片

技术图片

(3) Transform实现

Hive 的 TRANSFORM 关键字提供了在 SQL 中调用自写脚本的功能。适合实现 Hive 中没有的 功能又不想写 UDF 的情况

具体以一个实例讲解。

Json 数据: "movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"

需求:把 timestamp 的值转换成日期编号

1、先加载 rating.json 文件到 hive 的一个原始表 rate_json

create table rate_json(line string) row format delimited;
load data local inpath ‘/home/hadoop/rating.json‘ into table rate_json;

 

2、创建 rate 这张表用来存储解析 json 出来的字段:

create table rate(movie int, rate int, unixtime int, userid int) row format delimited fields
terminated by ‘	‘;

 

解析 json,得到结果之后存入 rate 表:

技术图片
insert into table rate select
get_json_object(line,‘$.movie‘) as moive,
get_json_object(line,‘$.rate‘) as rate,
get_json_object(line,‘$.timeStamp‘) as unixtime,
get_json_object(line,‘$.uid‘) as userid
from rate_json;
技术图片

 

3、使用 transform+python 的方式去转换 unixtime 为 weekday

先编辑一个 python 脚本文件

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

保存文件 然后,将文件加入 hive 的 classpath:

hive>add file /home/hadoop/weekday_mapper.py;
hive> insert into table lastjsontable select transform(movie,rate,unixtime,userid)
using ‘python weekday_mapper.py‘ as(movie,rate,weekday,userid) from rate;

 

创建最后的用来存储调用 python 脚本解析出来的数据的表:lastjsontable

create table lastjsontable(movie int, rate int, weekday int, userid int) row format delimited
fields terminated by ‘	‘;

 

最后查询看数据是否正确

select distinct(weekday) from lastjsontable;

hive高级(代码片段)

HiveServer2概述:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Overview2客户端:https://cwiki.apache.org/confluence/display/Hive/HiveServer2+ClientsHive数据压缩压缩格式:bzip2,gzip,lzo,snappy等压缩比:bzip2 查看详情

hive高级调优(代码片段)

1、Explain查看执行计划1.1、创建测试用表,数据准备准备数据小表数据大表数据建大表、小表和JOIN后表的语句//创建大表createtablebigtable(idbigint,tbigint,uidstring,keywordstring,url_rankint,click_numint,click_urlstring)rowformatdelimitedfieldster 查看详情

hive表的常用操作(代码片段)

...习,如groupby、having、join、sortby、orderby等。一:hive表的操作1.1.1hive的库的创建与数据库的查看:hive(default)>createdatabaseyangyang;hive(default) 查看详情

hive学习之路hive的ddl操作(代码片段)

库操作1、创建库语法结构CREATE(DATABASE|SCHEMA)[IFNOTEXISTS]database_name  [COMMENTdatabase_comment]      //关于数据块的描述  [LOCATIONhdfs_path]          //指定数据库在HDFS上的存储位置  [WITHDBPROPERTIES(property_name=propert... 查看详情

hbase与hive的集成操作(代码片段)

...Base的集成,使得能够在HBase表上使用HQL语句进行查询插入操作以及进行Join和Union等复杂查询,同时也可以将hive表中的数据映射到HBase中;2.模型概念  2.1将ETL操作的数据存入HBase      2.2HBase作为Hive的数据源     ... 查看详情

hive表的创建的操作与测试(代码片段)

...据、如何检索分区表中的数据,练习截图一:hiveHQL的表操作:1.1.1创建数据库:hive>createdatabaseyangyang;hive>descdatabaseyangyang;删除数据库:hive>dropdatabaseyangyangcas 查看详情

hive表的创建的操作与测试(代码片段)

...据、如何检索分区表中的数据,练习截图一:hiveHQL的表操作:1.1.1创建数据库:hive>createdatabaseyangyang;hive>descdatabaseyangyang;删除数据库:hive>dropdatabaseyangyangcas 查看详情

hive之基本操作(代码片段)

beeline客户端hiveserver、hiveserver2的客户端,底层通过jdbc接口通讯hive命令后面会取消,会使用beeline替代不需要单独启动hiveserver的使用方式,类似于hive命令$$HIVE_HOME/bin/beeline-ujdbc:hive2://需要单独启动hiveserver的使用方式$$HIVE_HOME/bin/be... 查看详情

hive基本操作(代码片段)

Hive基本操作01.Hive是什么Hive介绍Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。Hive是SQL解析引擎,它将SQL语句转译成M/RJob然后在Hadoop执行。Hive架构p:用HDFS进行存储,... 查看详情

spark的hive操作和常见的bug(代码片段)

packagehiveimportorg.apache.spark.SparkConfimportorg.apache.spark.sql.SparkSessionobjectHiveDomedeffun1():Unit=valconf=newSparkConf().setAppName("hive")valspark=SparkSession.builder().appName("hive" 查看详情

hive的ddl操作(代码片段)

 库操作1、创建库语法结构CREATE(DATABASE|SCHEMA)[IFNOTEXISTS]database_name  [COMMENTdatabase_comment]      //关于数据块的描述  [LOCATIONhdfs_path]          //指定数据库在HDFS上的存储位置  [WITHDBPROPERTIES(property_name=p... 查看详情

hive数据定义与操作(代码片段)

Hive数据定义与操作HiveQL数据定义语言创建数据库createdatabasesogou;如果数据库sogou已经存在的话,会抛出异常,创建数据库的命令应为createdatabaseifnotexistssogou;查看数据库随时可以通过如下命令查看Hive中所包含的数据库showdat... 查看详情

hive学习——ddl&dml&dql语句(代码片段)

...部表3.外部表4.内部表与外部表的转换5.分区表6.分桶表7.高级建表语句8.修改表与删除表(三)数据操作1.数据导入2.插入数据3.数据导出三、DQL命令1.DQL语法2.字段名重命名——中文别名要用反引号,且as可有可无3.joinon——Hive仅... 查看详情

hive学习——ddl&dml&dql语句(代码片段)

...部表3.外部表4.内部表与外部表的转换5.分区表6.分桶表7.高级建表语句8.修改表与删除表(三)数据操作1.数据导入2.插入数据3.数据导出三、DQL命令1.DQL语法2.字段名重命名——中文别名要用反引号,且as可有可无3.joinon——Hive仅... 查看详情

如何监听对hive元数据的操作?(代码片段)

目录简介HIVE基本操作获取HIVE源码编译HIVE源码启动HIVE停止HIVE监听对HIVE元数据的操作参考文档简介公司有个元数据管理平台,会定期同步HIVE中的元数据。但这样做有个问题,就是如果在HIVE中插入了一张新表或者新库等HIVE元数据... 查看详情

hive基本语法操练:分区操作和桶操作(代码片段)

(一)分区操作Hive的分区通过在创建表时启动PARTITIONBY实现,用来分区的维度并不是实际数据的某一列,具体分区的标志是由插入内容时给定的。当要查询某一分区的内容时可以采用WHERE语句,例如使用“WHEREtablename.partition_ke... 查看详情

hive的高级应用

一、进入hive之前的操作1、简介进入hive客户端之前的操作hive[-hiveconfx=y]*[<-ifilename>]*[<-ffilename>|<-equery-string>]2、设置参数相关的(1)-hiveconf     -hiveconf===setkey=value   查看详情

hive中的表操作(代码片段)

1,hive概述Hive是基于Hadoop的数据仓库,用于处理结构化的数据集,数据结构存在于MySQL,数据存在HDFS。Hive可以将一个类似于sql的查询语句(HQL)翻译成MR程序,将job提交给HDFS进行查询时,hive把HDFS... 查看详情