Hive實例-解析百萬json以及python腳本的使用

實例


<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>

看看錶裡的數據


Hive實例-解析百萬json以及python腳本的使用

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>


Hive實例-解析百萬json以及python腳本的使用

看看數據插入後是什麼樣


Hive實例-解析百萬json以及python腳本的使用

番外-內置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>


Hive實例-解析百萬json以及python腳本的使用

最後說一下,想要學習大數據的限時領取免費資料及課程

領取方法:

還是那個萬年不變的老規矩

1.評論文章,沒字數限制,一個字都行!

3.私信小編:“大數據開發教程”即可!

謝謝大家,祝大家學習愉快!(拿到教程後一定要好好學習,多練習哦!)


分享到:


相關文章: