【Hadoop】常用命令整理

知識點一:
explode(split(get_json_object(fieldDataName,’$.str’),’,’))

1、fieldDataName表示數據庫字段名;
2、$.str表示要從數據庫定中JOSN類型的字段中取的內容

使用到的命令包括:
1、get_json_object :從JSON中取值;

get_json_object,多層JSON的取值
data =
{
"store":
    {
     "fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear"}],  
     "bicycle":{"price":19.95,"color":"red"}
     }, 
     "email":"amy@only_for_json_udf_test.net", 
      "owner":"amy" 
}

1.1、.get單層值
hive> select get_json_object(data, ‘$.owner’) from test;
結果:amy

1.2.get多層值.
hive> select get_json_object(data, ‘$.store.bicycle.price’) from test;
結果:19.95

1.3.get數組值[]
hive> select get_json_object(data, ‘$.store.fruit[0]’) from test;
結果:{“weight”:8,“type”:“apple”}

2、split:按,號分隔
split中使用多個分隔符的示例:

select split('張三|李四,王五|趙六',',|\\|')

多個分隔符使用“|”號進行連接。在上面的例子中,第一個分隔符是“,”,第二個分隔符是“\|”,因爲本身多個分隔符就是使用|連接的,所以需要加\用來轉義

3、explode:explode就是將hive一行中複雜的array或者map結構拆分成多行。explode可能經常會與Lateralview一起使用

4、Lateral view: 其實就是用來和像類似explode這種UDTF函數聯用的。lateral view 會將UDTF生成的結果放到一個虛擬表中,然後這個虛擬表會和輸入行即每個game_id進行join 來達到連接UDTF外的select字段的目的。

示例:
select distinct course,student1 From courselog lateral view explode(split(get_json_object(data,’$.student’),’,’)) t as student1
where area=‘310000’ and log_date>=‘2018-11-01’ and student1<>’[]’

知識點二: HVIE中配合正則表達式的使用

例如:需要將[“張三”,“李四”]中學生名字取出來。

如果直接使用select explode(split('["張三","李四"]',',')),得出的結果就是:

[“張三”
“李四”]

這並不是我們希望得到的結果。希望的結果應該是不包括雙引號,不包括中括號的。使用正則表達式對字符進行處理:

select explode(split(regexp_extract('["張三","李四"]','\\[(.+)\\]',1),','))

以上得到的結果就是去除[]的結果。

但是其實我們還是希望把雙引號也去掉的。上面我們是希望把以下字符串([]")替換掉就可以了,發現可以使用以下命令來處理:

select regexp_replace('["張三","李四"]','"|\\[|\\]','')

這個得到的結果就是:張三,李四
到這一步再結合explode就可以達到效果了:

select explode(split(regexp_replace('["張三","李四"]','"|\\[|\\]',''),','))

這樣得到的結果就是:

張三

李四

知識點三:關於HIVE裏面進行時間戮和日期格式的轉換:
from_unixtime(時間戮,日期格式),日期格式如果不指定,默認是’yyyy-MM-dd HH:mm:ss’

如果我們存儲的時間戮格式是到毫秒的,需要將最後三位去掉,使用cast進行類型轉換。

例如:from_unixtime(cast(t.time/1000 as int),‘yyyy-MM-dd’)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章