1. 程式人生 > >hive中UDF開發:解析json物件和解析json陣列物件

hive中UDF開發:解析json物件和解析json陣列物件

hive預設函式:

+-------------------------------------------------------------------+
                                json
 +-------------------------------------------------------------------+
 {"store":
   {"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],
    "bicycle":{"price":19.95,"color":"red"}
   },
  "email":"
[email protected]
_for_json_udf_test.net", "owner":"amy" } +-------------------------------------------------------------------+
 json內容可以用以下查詢語句解析
  1. hive> SELECT get_json_object(src_json.json, '$.owner'FROM src_json;  
  2. amy  
  3. hive> SELECT get_json_object(src_json.json, '$.store.fruit[0]'
    FROM src_json;  
  4. {"weight":8,"type":"apple"}  
  5. hive> SELECT get_json_object(src_json.json, '$.non_exist_key'FROM src_json;  
  6. 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 

相關推薦

hiveUDF開發解析json物件解析json陣列物件

hive預設函式: +-------------------------------------------------------------------+ json +--------------

SpringMVC使用@RequestBody,@ResponseBody註解實現Java物件XML/JSON資料自動轉換(上)

Spring3.1開始使用新的HandlerMapping 和 HandlerAdapter 來支援@Contoller 和@RequestMapping註解處理:處理器對映RequestMappingHandlerMapping和處理器介面卡RequestMappingH

hiveUDF、UDAFUDTF使用

Hive進行UDF開發十分簡單,此處所說UDF為Temporary的function,所以需要hive版本在0.4.0以上才可以。一、背景:Hive是基於Hadoop中的MapReduce,提供HQL查詢的資料倉庫。Hive是一個很開放的系統,很多內容都支援使用者定製,包

十八、Hive UDF程式設計

 依據課程中講解的如何自定義UDF,進行案例編寫,進行總結步驟,並完成額外需求,具體說明如下:1) 依據課程講解UDF程式設計案例,完成練習,總結開發UDF步驟,程式碼貼圖, 給予註釋,重點在於

HiveUDFUDAF的使用

UDF使用者自定義函式(user defined function)–針對單條記錄。 建立函式流程 1、自定義一個Java類2、繼承UDF類 3、重寫evaluate方法 4、打成jar包 6、在hive執行add jar方法7、在hive執行建立模板函式 8、hql中使用D

hiveUDFUDAF使用說明

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元件的componentdata屬性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和資料結構 由於我們在上面回溯執行緒呼叫棧拿到的是一組地址,所以這裡進行符號化的輸入輸出應該分別是地址和符號,介面設