最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
hive中l(wèi)ateralview怎么用

這篇文章主要介紹了hive中l(wèi)ateral view怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供合川網(wǎng)站建設(shè)、合川做網(wǎng)站、合川網(wǎng)站設(shè)計、合川網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、合川企業(yè)網(wǎng)站模板建站服務(wù),10年合川做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

概況

Lateral view與UDTF函數(shù)一起使用,UDTF對每個輸入行產(chǎn)生0或者多個輸出行。Lateral view首先在基表的每個輸入行應(yīng)用UDTF,然后連接結(jié)果輸出行與輸入行組成擁有指定表別名的虛擬表。

測試SQL

explain SELECT id, sq,myCol from window_test_table LATERAL VIEW explode(split(sq,',')) myTab as myCol;

hive中l(wèi)ateral view怎么用

這個sql 經(jīng)歷了兩條線:

ts(TableScan)-->lvf(Lateral View Forward)-->sel(Select)-->lvj(Lateral View Join)-->sel(Select)
ts(TableScan)-->lvf(Lateral View Forward)-->sel(Select)-->udtf-->lvj(Lateral View Join)-->sel(Select)

1、TableScanOperator

不多說,常規(guī)讀表操作

2、LateralViewForwardOperator

@Override
public void process(Object row, int tag) throws HiveException {
  forward(row, inputObjInspectors[tag]);
}

幾乎什么都沒做,數(shù)據(jù)怎么來的,還怎么送出去。

2-1、左側(cè)SelectOperator

篩選出你需要的非explode的列:id,sq

2-2-1、右側(cè)SelectOperator

篩選出explode的列:split(sq, ',')

2-2-2、右側(cè)UDTFOperator

@Override
public void process(Object row, int tag) throws HiveException {
  StructObjectInspector soi = (StructObjectInspector) inputObjInspectors[tag];
  List fields = soi.getAllStructFieldRefs();
 //從row里解出字段
 for (int i = 0; i < fields.size(); i++) {
    objToSendToUDTF[i] = soi.getStructFieldData(row, fields.get(i));
  }
//真正處理數(shù)據(jù)的是 genericUDTF的某個實現(xiàn)類,比如,explode,那就是GenericUDTFExplode.java 的process
  genericUDTF.process(objToSendToUDTF);
 //這里判斷一下有沒有outer關(guān)鍵字。這里真的真的真的是,可能用了很久了,還不知道udtf還有個outer 關(guān)鍵字
 if (conf.isOuterLV() && collector.getCounter() == 0) {
 //思考一下這一步是干嘛?
    collector.collect(outerObj);
  }
  collector.reset();
}

GenericUDTFExplode.java就相當容易理解了,畢竟我們自己寫udtf時,也是這么做的:

/**
 * GenericUDTFExplode.
 *
 */
@Description(name = "explode",
    value = "_FUNC_(a) - separates the elements of array a into multiple rows,"
      + " or the elements of a map into multiple rows and columns ")
public class GenericUDTFExplode extends GenericUDTF {
....
@Override
//主要處理數(shù)據(jù)的方法
public void process(Object[] o) throws HiveException {
 switch (inputOI.getCategory()) {
 case LIST:  //處理list
    ListObjectInspector listOI = (ListObjectInspector)inputOI;
 List list = listOI.getList(o[0]);
 if (list == null) {
 return;  //當數(shù)組里沒有值時,不發(fā)送數(shù)據(jù)
    }
 for (Object r : list) {
      forwardListObj[0] = r;
      forward(forwardListObj);
    }
 break;
 case MAP: //處理map
    MapObjectInspector mapOI = (MapObjectInspector)inputOI;
    Map map = mapOI.getMap(o[0]);
 if (map == null) {
 return;
    }
 for (Entry r : map.entrySet()) {
      forwardMapObj[0] = r.getKey();
      forwardMapObj[1] = r.getValue();
      forward(forwardMapObj);
    }
 break;
 default:
 throw new TaskExecutionException("explode() can only operate on an array or a map");
  }
}
....
}
為什么要有outer關(guān)鍵字?

當UDTF不產(chǎn)生任何行時,比如explode()函數(shù)的輸入列為空,LATERALVIEW就不會生成任何輸出行。在這種情況下原有行永遠不會出現(xiàn)在結(jié)果中。OUTRE可被用于阻止這種情況,輸出行中來自UDTF的列將被設(shè)置為NULL。

例如:

hive中l(wèi)ateral view怎么用

實際上從代碼里,也能夠看到:

hive中l(wèi)ateral view怎么用

UDTF會借助UDTFCollector為其展開的結(jié)果計數(shù),并forward:

@Override
public void collect(Object input) throws HiveException {
  op.forwardUDTFOutput(input);
  counter++;
}

如果沒有展開結(jié)果,counter就為0。 這樣,進入outer之后,會把之前建好的沒有內(nèi)容的outerObj給forward到下個 算子LateralViewJoinOperator

3、LateralViewJoinOperator

@Override
public void process(Object row, int tag) throws HiveException {
  StructObjectInspector soi = (StructObjectInspector) inputObjInspectors[tag];
//標識是左側(cè)select過來的  
if (tag == SELECT_TAG) {
    selectObjs.clear();
    selectObjs.addAll(soi.getStructFieldsDataAsList(row));
  } else if (tag == UDTF_TAG) {  //代表是右側(cè)udtf過來的
    acc.clear();
    acc.addAll(selectObjs);
    acc.addAll(soi.getStructFieldsDataAsList(row));  //合并數(shù)據(jù)
    forward(acc, outputObjInspector);
  } else {
 throw new HiveException("Invalid tag");
  }


}

LateralViewJoinOperator處理邏輯也是很簡單明了,這里的join也是簡單的List.addAll

是否有shuffle

Lateral view explode 會產(chǎn)生shuffle嗎?

當然不會,毋庸置疑! 其實一開始看執(zhí)行計劃就會發(fā)現(xiàn),沒有reduce任務(wù)呀~~

這里的Join代表的是兩份數(shù)據(jù)聯(lián)接到一起的意思,并不是真正的意義上的join。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“hive中l(wèi)ateral view怎么用”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!


新聞名稱:hive中l(wèi)ateralview怎么用
分享地址:http://fisionsoft.com.cn/article/jdcspi.html