實例
<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.私信小編:“大數據開發教程”即可!
謝謝大家,祝大家學習愉快!(拿到教程後一定要好好學習,多練習哦!)
閱讀更多 微笑數據工程師 的文章