实例
<code>使用UDF解析一百万条json并按字段插入表中/<code>
1.编写UDF
<code>public class MovieJsonParser extends UDF { public String evaluate(String json) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); MovieBean movieBean = objectMapper.readValue(json, MovieBean.class); return movieBean.toString(); }}/<code>
其中movie bean为
<code>public class MovieBean { private String movie; private String rate; private String timeStamp; private String uid; @Override public String toString() { return movie+ "," + rate + "," + timeStamp+","+uid; }}/<code>
2.打成jar包并加入到hive的classpath中
<code>addJAR/home/hadoop/moviejsonparser.jar/<code>
3.创建函数
<code>create temporary function jsonparser as 'com.kris.bigdata.hive.udf.MovieJsonParser';/<code>
4.创建json表,并载入数据
<code>create table t_movie_json(json string);load data local inpath '/home/hadoop/rating.json' overwrite into table t_movie_json;/<code>
看看表里的数据
5.创建解析后插入的表
<code>create table t_movie_rating(movie string,rate string,unixtime string,uid string)row format delimitedfields terminated by ',';/<code>
6.解析并插入到新表
使用我们前面创建的UDF函数,解析json,输出固定格式字符串,对字符串进行切割取对应值
<code>insert into t_movie_ratingselect split(moviejsonparser(json),',')[0],split(moviejsonparser(json),',')[1],split(moviejsonparser(json),',')[2],split(moviejsonparser(json),',')[3] from t_movie_json;/<code>
看看数据插入后是什么样
番外-内置json函数
hive中内置了json解析函数,但是只能解析单层的json对象,对于比较复杂的json,还是需要自己写UDF进行解析。
<code>select get_json_object(json,'$.movie') as movie,get_json_object(json,'$.rate') as rate from t_movie_json limit 10;/<code>
Transform实现
<code>使用TRANSFORM关键字,我们可以在SQL中调用我们自己写的脚本。适合于Hive没有的功能,又不想写UDF的情况。下面我们用一个python脚本实现将查询出来的unixtime转为易于查看的weekday/<code>
1.首先编写一个python脚本
<code>vi weekday_mapper.py#!/bin/pythonimport sysimport datetime#遍历输入的每一行for line in sys.stdin: #去掉首尾空格 line = line.strip(); #切割每一行,拿到每个值 movieid,rating,unixtime,userid = line.split('\\t') #转换unixtime为weekday。具体过程是先将unixtime强转为float,然后将float转换为datetime,然后调用datetime的isoweekday()方法获得weekday weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() #输出数据,用\\t相隔 print '\\t'.join([movieid,rating,str(weekday),userid])/<code>
2.将文件加入hive的classpath
<code>add FILE /home/hadoop/weekday.py;/<code>
3.使用脚本转换unixtime并插入新表
<code>CREATE TABLE u_data_new asSELECTTRANSFORM (movieid,rate,unixtime,uid)USING 'python weekday.py'AS (movieid,rate,weekday,uid)FROM t_movie_rating;/<code>
最后说一下,想要学习大数据的限时领取免费资料及课程
领取方法:
还是那个万年不变的老规矩
1.评论文章,没字数限制,一个字都行!
3.私信小编:“大数据开发教程”即可!
谢谢大家,祝大家学习愉快!(拿到教程后一定要好好学习,多练习哦!)
閱讀更多 微笑數據工程師 的文章