HiveJson數(shù)據(jù)存儲格式是怎么樣的

這篇文章主要介紹Hive Json數(shù)據(jù)存儲格式是怎么樣的,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

創(chuàng)新互聯(lián)成立于2013年,先為兗州等服務(wù)建站,兗州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為兗州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

數(shù)據(jù)以json的形式存放,一行一個json數(shù)據(jù)。

要是

{"field1":"data1","field2":100,"field3":"more data1","field4":123.001} {"field1":"data2","field2":200,"field3":"more data2","field4":123.002} {"field1":"data3","field2":300,"field3":"more data3","field4":123.003} {"field1":"data4","field2":400,"field3":"more data4","field4":123.004}

形式,而不能進(jìn)行格式化!

下載hive-hcatalog-core.jar對應(yīng)版本。

add到hive中

ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar;

創(chuàng)建json表

CREATE TABLE json_table(a string, b bigint)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE;

準(zhǔn)備數(shù)據(jù)

{"a":"k","b":1}
{"a":"l","b":2}

load 進(jìn)來

load data local inpath '/home/hadoop/json.txt' into table json_table

如果load的數(shù)據(jù)不符合格式要求,比如不是json的,或者其他問題,不進(jìn)行提示。

當(dāng)使用表的時候,出現(xiàn)問題則提示。

Hive Json數(shù)據(jù)存儲格式是怎么樣的

復(fù)雜的json處理方式,形如這樣

Hive Json數(shù)據(jù)存儲格式是怎么樣的

使用的時候,where conflict["xxx"]=yyy 針對map而言。其他的array和struct,參照hive文檔使用即可。

現(xiàn)在有個新的想法,如果存在hdfs上的文件,不是想要的json格式咋辦,如何通過jsonSerde讀取呢?

例如:

{
    "es": "1459442280603,0,hhh,,0,tyryrt,fff gfhgfh,,,,,,,,,,,,,,1511240411010000754,\n",
    "hd": {
        "a": "90014A0507091BC4",
        "b": "19",
        "c": "74:04:2b:da:00:97"
    }
}

整個json是正常的,但是es部分,是一個串,我想把es部分也變成一個json對象array啥的,但是不能改變原來hdfs上數(shù)據(jù)的結(jié)構(gòu),畢竟很多mr程序都寫好了,改動起來工程浩大。

顯然的答案是自定義一個JsonSerDe即可,修改部分源碼即可。

github上。https://github.com/rcongiu/Hive-JSON-Serde  非常不錯,可以下載下來,修改代碼,重新編譯,我修改的代碼是org.openx.data.jsonserde.JsonSerDe的deserialize方法,改方法從名字上可以判斷是解析從hdfs上讀出的數(shù)據(jù),參數(shù)是一個writable。

Hive Json數(shù)據(jù)存儲格式是怎么樣的

獲取es部分的代碼,重新解析,生成心的json對象,最終放到總的json對象中即可

Hive Json數(shù)據(jù)存儲格式是怎么樣的

這樣,我們創(chuàng)建hive表的時候,就可以使用這個es1屬性了啊,

值得注意的一點:

es解析成[[xx,yy,zz],[xx1,yy1,zz1]] 那么hive定義的形式如下:

CREATE external TABLE jsontest (es string,
    es1 array<struct<name1:string,name2:string,name3:string>>,
    hd map<string,string>)

而最開始我的做法是:

es解析成[{"name1":xx,"name2":yy,"name3":zz},{"name1":xx1,"name2":yy1,"name3":zz1}]

然后hive表定義為:

CREATE external TABLE jsontest (es string,
    es1 array<map<string,string>>,
    hd map<string,string>)

總是總問題,而且真有問題,沒反應(yīng)過來呢。還是用struct吧,畢竟name可以在hive表中可以指定,而不是在代碼寫死。

打包編譯:

mvn -Dcdh.version=1.3.1 package  -Dmaven.test.skip=true

--------------------------------------------------------

這么做,雖然能將非正規(guī)的字符解析成正規(guī)的字符,并通過hive的數(shù)據(jù)結(jié)果映射,但是有個問題,es1是一個數(shù)組,如果我想讓es1的某個struct對象放在where中進(jìn)行判斷使用,但是es1的大小又不是固定的,而且,我也無法知道到底是數(shù)組的哪個個元素可以用來判斷,因此,上述方法有弊端。

新的方法:

events1 里面使用array,但是不使用struct而是使用string

CREATE external TABLE test.nginx_logs2 (events string,
    events1 array<string>,
    header map<string,string>)
partitioned by (datepart string,app_token string) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'

這時候,源碼就要拼成正規(guī)的json字符就行了。

之后使用hive explore等方法,來將events1的數(shù)組展開,接著使用get_json_obj獲得json串中的某個屬性。比如如下操作。

SELECT event_name,
       count(DISTINCT user_id) AS num
  FROM ( SELECT header["user_id"] AS user_id, get_json_object(event,'$.name') AS event_name
   FROM test.nginx_logs2 LATERAL VIEW explode(events1) events1 AS event
   WHERE get_json_object(event,'$.name')='xxx'
     AND get_json_object(event,'$.type')='0' ) f
GROUP BY event_name

以上是“Hive Json數(shù)據(jù)存儲格式是怎么樣的”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

分享標(biāo)題:HiveJson數(shù)據(jù)存儲格式是怎么樣的
文章位置:http://bm7419.com/article30/goispo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、關(guān)鍵詞優(yōu)化、域名注冊搜索引擎優(yōu)化、品牌網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司