关于有效将Json导入Hive的方式(Hive函数)

前言

最近在做有关大数据的本科毕设,确实是新东西,有好多知识盲区。从比较基础的举例子,我从网页上爬下来的数据是Json格式,可是怎么能够以不加key键的形式导入,我只要个数据值呢?
这时候聪明的小伙伴就想到了!
“我可以用文本编辑器把key值部分替换掉,只留value!!!”
当然不是这种方法啊喂!
话不多说,下来直接到正文!

正文

比如,我有一条这样的数据:
{“movie”:“944”,“rate”:“5”,“timeStamp”:“974943336”,“uid”:“1068”}
{“movie”:“1479”,“rate”:“5”,“timeStamp”:“974948743”,“uid”:“1068”}
{“movie”:“2420”,“rate”:“3”,“timeStamp”:“974953151”,“uid”:“1068”}

我想把它导入到hive里方便离线分析

最基本的用Json类型导入

我把上面三条数据,取名movie.json
1.先在hive中建立一个hive表,Hql指令如下:
create table movie_json(json string);
2.将movie.json文件上传至虚拟机系统,比如我上传的目录为 /root/hivetest/movie.json
3.继续在hive中执行如下指令,将Json信息输入hive表
load data local inpath ‘/root/hivetest/movie.json’ into table movie_json
4.我们来看一下加载的情况:

movie_json.json
{“movie”:“944”,“rate”:“5”,“timeStamp”:“974943336”,“uid”:“1068”}
{“movie”:“1479”,“rate”:“5”,“timeStamp”:“974948743”,“uid”:“1068”}
{“movie”:“2420”,“rate”:“3”,“timeStamp”:“974953151”,“uid”:“1068”}

当时做实验时忘记截图结果了,大家大体理解下
我们发现,欸,导入的数据还是Json格式,我要处理分析岂不是很麻烦!!接下来,就给大家介绍用hive函数的方式!

Hive函数导入json数据value

思路

我们是不是曾经想过!
“如果Hive中有个函数,可以直接取到Json数据的value值就好了…”
虽然hive中没有,但我们可以自己写一个!
比如,我定义一个myjson函数,myjson(json,0)就可以取到json串的第一个value值,同理myjson(json,1)就可以取到第二个,以此类推…
有想法就去行动!

解决步骤

那么hive中如何定义自己的函数(这也是hive的特色
1.先写一个java程序,实现你想要的函数功能(传入json字符串和k-v的位置,返回value值)
2.将java程序打成jar包,上传带hive所在机器
3.在hive命令行中添加jar包到classpath
4.在hive命令中用命令创建一个函数,关联自己写的java类

1.Java程序

话不多说 直接来个程序
编程前一定要记得把hive中的jar包导入,当然也可以用maven

package hive.json.division;

import org.apache.hadoop.hive.ql.exec.UDF;

public class MyJsonParser extends UDF{
	
	//重载父类中的一个方法evaluate()
	public String evaluate(String json,int index) {
		//{"movie":"944","rate":"5","timeStamp":"974943336","uid":"1068"}
		String[] fields = json.split("\"");    //'\'为转义,以"切割
		
		
		return fields[4*index-1];//以上面注释的数据为例,movie为第一段;:为第二段;944为第三段.....以此类推
		
	}

}

很简单的一个程序,需要做到的就是理解和举一反三
这是对hive中UDF的重写

2. 打包并上传

这个就不用我多说了8…
右键你的工程->点击Expot
关于有效将Json导入Hive的方式(Hive函数)_第1张图片
选择路径然后不多解释了,上传到有hive的虚拟机上就完事儿了
jar包名字随便起,我起的myjson.jar

3.添加jar包到classpath

老马后炮儿了,理解下。
集群都关了突然想写个博客,后面就没有截图了,大家脑海中理解下!
比如我把jar包上传到虚拟机中的 /root/hivetest/myjson.jar
打开hive命令行 输入如下指令
add jar /root/hivetest/myjson.jar;
将jar包添加到hive的classpath
没报错就是成功了(废话

4.创建临时函数并关联

继续在刚刚hive的命令行下敲
create temporary function myjson as ‘hive.json.division.MyJsonParser’;
myjson是你要起的函数名(随便起
hive.json.division是包名,根据自己的写
MyJsonParser是类名,根据自己的写
没报错就是成功了(梅 开 二 度

最终验证

在hive命令行中输入以下代码:
create table m_info as
select myjson(json,1) as movie,
myjson(json,2) as rate,
myjson(json,3) as ts.
myjson(json,4) as uid
from movie_json;

(假装有截图)
我们查询一下
select * from m_info;
截图.jpg

哇!!!通过截图我们可以看到,结果就是我们要的那样,是不是非常斯国一呢!

因为考研复试,毕设做的十分慢,确实慌。
能学学,不能学还得学QAQ

你可能感兴趣的:(学习)