hive中UDF開發:解析json物件和解析json陣列物件
hive預設函式:
+-------------------------------------------------------------------+ json +-------------------------------------------------------------------+ {"store": {"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle":{"price":19.95,"color":"red"} }, "email":"json內容可以用以下查詢語句解析[email protected]_for_json_udf_test.net", "owner":"amy" } +-------------------------------------------------------------------+
- hive> SELECT get_json_object(src_json.json, '$.owner') FROM src_json;
- amy
-
hive> SELECT get_json_object(src_json.json, '$.store.fruit[0]'
- {"weight":8,"type":"apple"}
- hive> SELECT get_json_object(src_json.json, '$.non_exist_key') FROM src_json;
- NULL
查閱hive的UDF函式指南可知,雖然udf中的get_json_object和json_tuple能對json解析,但有時候沒法實現複雜業務擴充套件,同時也沒有UDF對JSON陣列的解析,因此,很多時候需要自己實現解析JSON的UDF,寫UDF中如果使用大量開源庫(例如fastjson或gson)則會直接導致生成的jar依賴較大,並不是最理想的,本博文查閱了hive原始碼,發現hive內部用JSONObject和JSONArray解析json物件,則我們同樣可以使用這兩個物件解析即可,本文旨在提供一個可呼叫json物件和陣列的解析udf,並提供複雜json的解析,而不是替代get_json_object等內建函式。
一、JSONObject解析JSON物件
package com.jd.bdp.util.udf;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;
/**
* JSON物件解析UDF
* date:2017-04-20
*/
public class GetJsonObject extends UDF {
/**
* 解析json並返回對應的值。例如
add jar jar/bdp_udf_demo-1.0.0.jar;
create temporary function getJsonObject as 'com.jd.bdp.util.udf.GetJsonObject';
select getJsonObject(json字串,key值)
* @param jsonStr
* @param objName
* @return
*/
public String evaluate(String jsonStr,String objName) throws JSONException {
if(StringUtils.isBlank(jsonStr)|| StringUtils.isBlank(objName)){
return null;
}
JSONObject jsonObject = new JSONObject(new JSONTokener(jsonStr));
Object objValue = jsonObject.get(objName);
if(objValue==null){
return null;
}
return objValue.toString();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
二、JSONArray解析JSON陣列物件
對json陣列字串的解析,最關鍵的是生成子json字串物件,之後往往需要配合上文中getJsonObject或get_json_object進行子json字串物件讀取資料了。下面程式碼實現瞭解析json字串陣列物件生成子json字串物件陣列。
package com.jd.bdp.util.udf;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.io.Text;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONTokener;
import java.util.ArrayList;
/**
* JSON陣列物件解析UDF
* date:2017-04-20
*/
public class GetJsonArray extends UDF {
/**
* 解析json並返回對應子json字串陣列,例如
add jar jar/bdp_udf_demo-1.0.0.jar;
create temporary function getJsonArray as 'com.jd.bdp.util.udf.GetJsonArray';
select getJsonArray(json字串)
* @param jsonArrayStr
* @return
* @throws HiveException
*/
public ArrayList<Text> evaluate(String jsonArrayStr) throws JSONException {
if(StringUtils.isBlank(jsonArrayStr)||StringUtils.isBlank(jsonArrayStr)){
return null;
}
ArrayList<Text> textList = new ArrayList<Text>();
if(!jsonArrayStr.trim().startsWith("[")){
textList.add(new Text(jsonArrayStr));
}else{
JSONArray jsonArray = new JSONArray(new JSONTokener(jsonArrayStr));
Text[] jsonTexts = new Text[jsonArray.length()];
for(int i=0;i<jsonArray.length();i++){
String json = jsonArray.getJSONObject(i).toString();
textList.add(new Text(json));
}
}
return textList;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
三、兩個UDF的配合使用過程
新增自定義函式
add jar jar/bdp_udf_demo-1.0.0.jar;
create temporary function getJsonObject as 'com.jd.bdp.util.udf.GetJsonObject';
create temporary function getJsonArray as 'com.jd.bdp.util.udf.GetJsonArray';
- 1
- 2
- 3
在hql中使用自定義UDF函式
本場景是對fdm_janc2_product_1_chain表中的productioninfo中json字串陣列解析,並使用lateral view explode對生成的子json字串陣列列轉行,最後對子json字串解析讀取資料。
select
getJsonObject(adtable.info,'factoryAddress') factoryAddress,
getJsonObject(adtable.info,'factoryName') factoryName,
getJsonObject(adtable.info,'factoryQs') factoryQs,
*
from
(
select * from fdm.fdm_janc2_product_1_chain where dp = 'ACTIVE'
)dtl lateral view explode(getJsonArray(productioninfo)) adtable as info
相關推薦
hive中UDF開發:解析json物件和解析json陣列物件
hive預設函式: +-------------------------------------------------------------------+ json +--------------
SpringMVC中使用@RequestBody,@ResponseBody註解實現Java物件和XML/JSON資料自動轉換(上)
Spring3.1開始使用新的HandlerMapping 和 HandlerAdapter 來支援@Contoller 和@RequestMapping註解處理:處理器對映RequestMappingHandlerMapping和處理器介面卡RequestMappingH
hive中UDF、UDAF和UDTF使用
Hive進行UDF開發十分簡單,此處所說UDF為Temporary的function,所以需要hive版本在0.4.0以上才可以。一、背景:Hive是基於Hadoop中的MapReduce,提供HQL查詢的資料倉庫。Hive是一個很開放的系統,很多內容都支援使用者定製,包
十八、Hive 中UDF程式設計
依據課程中講解的如何自定義UDF,進行案例編寫,進行總結步驟,並完成額外需求,具體說明如下:1) 依據課程講解UDF程式設計案例,完成練習,總結開發UDF步驟,程式碼貼圖, 給予註釋,重點在於
Hive中UDF和UDAF的使用
UDF使用者自定義函式(user defined function)–針對單條記錄。 建立函式流程 1、自定義一個Java類2、繼承UDF類 3、重寫evaluate方法 4、打成jar包 6、在hive執行add jar方法7、在hive執行建立模板函式 8、hql中使用D
hive中UDF和UDAF使用說明
Hive進行UDF開發十分簡單,此處所說UDF為Temporary的function,所以需要hive版本在0.4.0以上才可以。 一、背景:Hive是基於Hadoop中的MapReduce,提供HQL查詢的資料倉庫。Hive是一個很開放的系統,很多內容都支援使用者定製,包括
Python實現支援JSON儲存和解析的物件
我們知道利用JSON模組可方便的將Python基本型別(dict、list等)資料永久的儲存成檔案,同時也可以通過自定義轉換函式和繼承JSON encode&decode的方法實現自定義類的儲
hive載入json資料和解析json
事先說明,本人菜雞一隻,如果有說錯的地方,還請大家指出批評,多多包涵~一、今天記錄一下使用hive怎麼載入json格式的資料,對於json格式,就不多做更多說明了,測試的資料是spark的example裡面的people.json,資料很少,但是說明情況足矣。先給出官網地址:
安卓開發:SmartImageView簡單實現和應用
overload override ans geb actor dsta pub pac 獲取 通常從服務器端獲取的圖片是URL地址,如果簡單地通過URL地址獲取圖片? 有一個開源項目:SmartImageView,做到了這個功能,同時還有其他功能,下載不便,過於龐大 這裏
Android OpenSL ES 開發:Android OpenSL 介紹和開發流程說明
ror logic ogr activity engine eid 優化 als 分享 一、Android OpenSL ES 介紹 OpenSL ES (Open Sound Library for Embedded Systems)是無授權費、跨平臺、針對嵌入式系統精心
LeetCode演算法題53:最大子序和解析
給定一個整數陣列 nums ,找到一個具有最大和的連續子陣列(子陣列最少包含一個元素),返回其最大和。 示例: 輸入: [-2,1,-3,4,-1,2,1,-5,4], 輸出: 6 解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。 這個題如果用暴力破解怕是複雜度有些過於
Vue元件的component中data屬性function傳物件和不穿的物件的區別(不同效果)
話不多說上程式碼測試: 定義一個全域性元件,繫結msg 我們首先看如果把data的值外傳不在元件裡面建立的效果 <body> <div id="app"> <counter></counter>
Python web開發:Flask的URL和檢視
URL與檢視 URL與函式的對映: 從之前的helloworld.py檔案中,我們已經看到,一個URL要與執行函式進行對映,使用的是@app.route裝飾器。@app.route裝飾器中,可以指定URL的規則來進行更加詳細的對映,比如現在要對映一個文章詳情的URL,文章詳情的URL
安卓開發:SliddingMenu的使用和配置
時間:2018.10.21 Adroid Studio(AS,我的是最新版2.3.1)中匯入 1.在原來的專案中加入SlidingMenu-master中的library(我把這個資料夾重新命名為SliddingMenu_library) 第一種方法:使用file-
Jsp中標籤使用:tag 檔案方式 和 tld檔案方式
Tag檔案 Tag檔案和JSP檔案很類似,可以被JSP頁面動態載入呼叫,但是使用者不能通過該Tag檔案所在Web服務目錄直接訪問這個Tag檔案。 Tag檔案的兩點好處: (1)在設計Web應用時,可以通過編寫Tag檔案實現程式碼複用。 (2)可將JSP頁面中的關於資料處
大資料開發:實時資料平臺和流計算
大資料開發 1、實時資料平臺整體架構 實時資料平臺的支撐技術主要包含四個方面:實時資料採集(如Flume),訊息中介軟體(如Kafka), 流計算框架(如Storm, Spark, Flink和Beam),以及資料實時儲存(如列
Qt 5讀取、解析、生成和儲存JSON檔案
專案中用到了一些JSON的東西,為了方便就做了一層簡單的封裝方便以後使用,包括了JSON的讀取、解析、生成和儲存這些基本功能 json.h檔案 #ifndef JSON_H #define JSON_H #include <QJsonArray> #include &l
http post+json 請求和解析utils類
1、package util;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import
介面中資料流的格式傳送請求和解析流請求
資料流格式傳送請求: HttpClient hc = new HttpClient(); int httpcode = 0; hc.setConnect
iOS中執行緒Call Stack的捕獲和解析(二)
1. 部分參考資料 做這一塊時也是查閱了很多連結和書籍,包括但不限於: 以及很多Google Search。 2. 相關API和資料結構 由於我們在上面回溯執行緒呼叫棧拿到的是一組地址,所以這裡進行符號化的輸入輸出應該分別是地址和符號,介面設