<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Hive UDF初探

      1. 引言

      前一篇中,解決了Hive表中復(fù)雜數(shù)據(jù)結(jié)構(gòu)平鋪化以導(dǎo)入Kylin的問題,但是平鋪之后計算廣告日志的曝光PV是翻倍的,因為一個用戶對應(yīng)于多個標(biāo)簽。所以,為了計算曝光PV,我們得另外創(chuàng)建視圖。

      分析需求:

      • 每個DSP上的曝光PV,標(biāo)簽覆蓋的曝光PV;
      • 累計曝光PV,累計標(biāo)簽覆蓋曝光PV

      相當(dāng)于cube(dsp, tag) + measure(pv),HiveQL如下:

      select dsp, tag, count(*) as pv
      from ad_view
      where view = 'view' and day_time between '2016-04-18' and '2016-04-24'
      group by dsp, tag with cube;
      

      現(xiàn)在問題來了:如何將原始表中的tags array<struct<tag:string,label:string,src:string>> 轉(zhuǎn)換成有標(biāo)簽(taged)、無標(biāo)簽(empty)呢?顯而易見的辦法,為字段tags寫一個UDF來判斷是否有標(biāo)簽。

      2. 實戰(zhàn)

      基本介紹

      user-defined function (UDF)包括:

      • 對于字段進(jìn)行轉(zhuǎn)換操作的函數(shù),如round()、abs()、concat()等;
      • 聚集函數(shù)user-defined aggregate functions (UDAFs),比如sum()、avg()等;
      • 表生成函數(shù)user-defined table generating functions (UDTFs),生成多列或多行數(shù)據(jù),比如explode()、inline()等

      UDTF的使用在與select語句使用時受到了限制,比如,不能與其他的列組合出現(xiàn):

      hive> SELECT name, explode(subordinates) FROM employees;
      FAILED: Error in semantic analysis: UDTF's are not supported outside the SELECT clause, nor nested in expressions
      

      Hive提供LATERAL VIEW關(guān)鍵字,對UDTF的輸入進(jìn)行包裝(wrap),如此可以達(dá)到列組合的效果:

      hive> SELECT name, sub
      > FROM employees
      > LATERAL VIEW explode(subordinates) subView AS sub;
      

      UDF與GenericUDF

      org.apache.hadoop.hive.ql.exec.UDF是字段轉(zhuǎn)換操作的基類,提供對于簡單數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換操作。在實現(xiàn)轉(zhuǎn)換操作時,需要重寫evaluate()方法。較UDF抽象類,org.apache.hadoop.hive.ql.udf.generic.GenericUDF提供更為復(fù)雜的處理方法類,包括三個方法:

      • initialize(ObjectInspector[] arguments),檢查輸入?yún)?shù)的類型、確定返回值的類型;
      • evaluate(DeferredObject[] arguments),字段轉(zhuǎn)換操作的實現(xiàn)函數(shù),其返回值的類型與initialize方法中所指定的返回類型保持一致;
      • getDisplayString(String[] children),給Hadoop任務(wù)展示debug信息的。

      判斷tags array<struct<tag:string,label:string,src:string>>是否為空標(biāo)簽(EMPTY)的UDF實現(xiàn)如下:

      @Description(name = "checkTag",
              value = "_FUNC_(array<struct>) - from the input array of struct "+
                      "returns the TAGED or EMPTY(no tag).",
              extended = "Example:\n"
                      + " > SELECT _FUNC_(tags_array) FROM src;")
      public class CheckTag extends GenericUDF {
        private ListObjectInspector listOI;
      
        public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
          if (arguments.length != 1) {
            throw new UDFArgumentLengthException("only takes 1 arguments: List<T>");
          }
      
          ObjectInspector a = arguments[0];
          if (!(a instanceof ListObjectInspector)) {
            throw new UDFArgumentException("first argument must be a list / array");
          }
          this.listOI = (ListObjectInspector) a;
      
          if(!(listOI.getListElementObjectInspector() instanceof StructObjectInspector)) {
            throw new UDFArgumentException("first argument must be a list of struct");
          }
      
          return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
        }
      
        public Object evaluate(DeferredObject[] arguments) throws HiveException {
          if(listOI == null || listOI.getListLength(arguments[0].get()) == 0) {
            return "null_field";
          }
      
          StructObjectInspector structOI = (StructObjectInspector) listOI.getListElementObjectInspector();
          String tag = structOI.getStructFieldData(listOI.getListElement(arguments[0].get(), 0),
                  structOI.getStructFieldRef("tag")).toString();
      
          if (listOI.getListLength(arguments[0].get()) == 1 && tag.equals("EMPTY")) {
            return "EMPTY";
          }
          return "TAGED";
        }
      
        public String getDisplayString(String[] children) {
          return "check tag whether is empty";
        }
      
      }
      

      還需添加依賴:

      <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>0.14.0</version>
        <scope>provided</scope>
      </dependency>
      
      <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.5.0-cdh5.3.2</version>
        <scope>provided</scope>
      </dependency>
      

      編譯后打成jar包,放在HDFS上,然后add jar即可調(diào)用該UDF了:

      add jar hdfs://path/to/udf-1.0-SNAPSHOT.jar;
      create temporary function checktag as 'com.hive.udf.CheckTag';
      
      create view if not exists yooshu_view
      partitioned on (day_time)
      as
      select uid, dsp, view, click, checktag(tags) as tag, day_time
      from ad_base;
      
      posted @ 2016-05-05 18:03  Treant  閱讀(6176)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久综合开心激情五月天| 国产免费无遮挡吸奶头视频 | 精品国产成人亚洲午夜福利| 国产线播放免费人成视频播放| 国产成人8X人网站视频| 色老99久久九九爱精品| 在线精品国精品国产尤物| 女人与公狍交酡女免费| yw尤物av无码国产在线观看| 成人欧美日韩一区二区三区| 亚洲乱码一区二区三区视色| 日韩理伦片一区二区三区| 97人妻熟女成人免费视频色戒| 元码人妻精品一区二区三区9| 成人区人妻精品一区二蜜臀 | 精品 无码 国产观看| 国产激情av一区二区三区| 国产边摸边吃奶边叫做激情视频 | 蓝山县| 三级国产在线观看| 精品国产AV最大网站| 日本va欧美va精品发布| 亚洲自拍偷拍激情视频| 亚洲欧洲久久激情久av| 18禁裸乳无遮挡啪啪无码免费| 中文字幕人妻中文AV不卡专区| 国产精品一区中文字幕| 色翁荡息又大又硬又粗又视频图片| 久久天天躁狠狠躁夜夜婷| 天堂网在线.www天堂在线资源| 东京热加勒比无码少妇| 亚洲综合久久精品哦夜夜嗨| 国产精品福利自产拍在线观看| 国产午夜鲁丝片av无码| 亚洲av成人无网码天堂| 亚洲综合视频一区二区三区| 人妻av无码一区二区三区| 精品亚洲国产成人| 日本偷拍自影像视频久久| 久久婷婷五月综合色一区二区| 国产一区二区三区禁18|