????????在hive中進(jìn)行數(shù)據(jù)處理和查詢時(shí)鼎兽,常用又比較生僻sql整理昼弟。
group by and having
????????group by通常會(huì)和聚合函數(shù)一起使用属瓣,按照某一個(gè)或者多個(gè)列對(duì)結(jié)果進(jìn)行分組员舵,然后對(duì)每個(gè)組進(jìn)行聚合操作。樣例如下:
????????hive > select year(ymd),avg(price_close) from stocks where exchange = 'NASDAQ' and symbol? = 'AAPL' group by year(ymd);
????????having子句允許用戶通過(guò)簡(jiǎn)單語(yǔ)法完成原本需要通過(guò)子查詢才能對(duì)group by 語(yǔ)句產(chǎn)生分組進(jìn)行條件過(guò)濾對(duì)任務(wù)捉兴。針對(duì)上面查詢語(yǔ)句增加having 語(yǔ)句限制輸出結(jié)果中年平均收盤(pán)大于50蝎困。
????????select year(ymd),avg(price_close) from stocks where exchange = 'NASDAQ' and symbol? = 'AAPL' group by year(ymd) having avg(price_close) > 50.0?
order by and sort by
????????hive中order by和其他sql中的定義是一樣的蚜厉,會(huì)對(duì)查詢結(jié)果集執(zhí)行一個(gè)全局排序墓阀,即會(huì)有一個(gè)所有的數(shù)據(jù)通過(guò)一個(gè)reducer進(jìn)行處理的過(guò)程,對(duì)于大數(shù)據(jù)集措近,這個(gè)過(guò)程會(huì)消耗太多時(shí)間虽缕。因?yàn)閛rder by執(zhí)行時(shí)間長(zhǎng)始藕,如果屬性hive.mapred.mode=strict,hive sql語(yǔ)句必須加limit語(yǔ)句進(jìn)行限制氮趋,默認(rèn)是nonstrict伍派,不會(huì)有限制。
含有sort by 的distribute by
????????默認(rèn)情況下剩胁,MapReduce計(jì)算框架會(huì)依據(jù)map輸入的鍵計(jì)算相應(yīng)哈希值诉植,按照哈希值將鍵-值對(duì)均勻分發(fā)到多個(gè)reducer中,這樣導(dǎo)致使用sort by時(shí)昵观,不同reducer的輸出內(nèi)容會(huì)有重疊晾腔,而如果使用distribute by 可以保證同一個(gè)key被分發(fā)到同一個(gè)reducer中進(jìn)行處理舌稀,然后對(duì)同一個(gè)reducer進(jìn)行排序。使用時(shí)候需要注意distribute by 語(yǔ)句要寫(xiě)在sort by 語(yǔ)句之前灼擂。
cluster by
? ? ? ? cluster by 等價(jià)于 distribute by? key sort by key
union all?
????????union all 可以將2個(gè)或多個(gè)表進(jìn)行合并壁查,每一個(gè)union子查詢都必需具有相同的列,并且對(duì)應(yīng)的每個(gè)字段的字段類(lèi)型必須是一致的剔应。