您好,登錄后才能下訂單哦!
這篇文章主要介紹Hive Json數據存儲格式是怎么樣的,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
數據以json的形式存放,一行一個json數據。
要是
{"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}
形式,而不能進行格式化!
下載hive-hcatalog-core.jar對應版本。
add到hive中
ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar;
創建json表
CREATE TABLE json_table(a string, b bigint)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE;
準備數據
{"a":"k","b":1}
{"a":"l","b":2}
load 進來
load data local inpath '/home/hadoop/json.txt' into table json_table
如果load的數據不符合格式要求,比如不是json的,或者其他問題,不進行提示。
當使用表的時候,出現問題則提示。
復雜的json處理方式,形如這樣
使用的時候,where conflict["xxx"]=yyy 針對map而言。其他的array和struct,參照hive文檔使用即可。
現在有個新的想法,如果存在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上數據的結構,畢竟很多mr程序都寫好了,改動起來工程浩大。
顯然的答案是自定義一個JsonSerDe即可,修改部分源碼即可。
github上。https://github.com/rcongiu/Hive-JSON-Serde 非常不錯,可以下載下來,修改代碼,重新編譯,我修改的代碼是org.openx.data.jsonserde.JsonSerDe的deserialize方法,改方法從名字上可以判斷是解析從hdfs上讀出的數據,參數是一個writable。
獲取es部分的代碼,重新解析,生成心的json對象,最終放到總的json對象中即可
這樣,我們創建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>)
總是總問題,而且真有問題,沒反應過來呢。還是用struct吧,畢竟name可以在hive表中可以指定,而不是在代碼寫死。
打包編譯:
mvn -Dcdh.version=1.3.1 package -Dmaven.test.skip=true
--------------------------------------------------------
這么做,雖然能將非正規的字符解析成正規的字符,并通過hive的數據結果映射,但是有個問題,es1是一個數組,如果我想讓es1的某個struct對象放在where中進行判斷使用,但是es1的大小又不是固定的,而且,我也無法知道到底是數組的哪個個元素可以用來判斷,因此,上述方法有弊端。
新的方法:
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'
這時候,源碼就要拼成正規的json字符就行了。
之后使用hive explore等方法,來將events1的數組展開,接著使用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數據存儲格式是怎么樣的”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。