中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hive Json數據存儲格式是怎么樣的

發布時間:2021-11-08 11:43:02 來源:億速云 閱讀:171 作者:小新 欄目:云計算

這篇文章主要介紹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的,或者其他問題,不進行提示。

當使用表的時候,出現問題則提示。

Hive Json數據存儲格式是怎么樣的

復雜的json處理方式,形如這樣

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

Hive Json數據存儲格式是怎么樣的

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

Hive 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數據存儲格式是怎么樣的”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

确山县| 五常市| 金乡县| 资源县| 渑池县| 巨野县| 西华县| 五常市| 贺兰县| 荥经县| 信阳市| 天峻县| 涟源市| 丰镇市| 沐川县| 龙游县| 南阳市| 凤山县| 孟连| 木兰县| 嵊泗县| 崇左市| 双牌县| 弥渡县| 得荣县| 南郑县| 隆德县| 新津县| 武鸣县| 临沂市| 卢氏县| 灯塔市| 鄂尔多斯市| 德兴市| 大城县| 霍城县| 广汉市| 永和县| 安龙县| 大石桥市| 新绛县|