大數據入門第十一天——hive詳解(三)hive函數

1、hive函數

  1.內置運算符與內置函數php

    函數分類:html

    

   查看函數信息:python

DESC FUNCTION concat;

   經常使用的分析函數之rank() row_number(),參考:https://www.cnblogs.com/wujin/p/6051768.htmlapache

   經常使用20個內置函數:json

      https://www.cnblogs.com/kimbo/p/6288516.htmlsession

    經常使用函數https://www.iteblog.com/archives/2258.htmlapp

    完整參考官方手冊http://www.javashuo.com/article/p-yeaiyels-er.htmlmaven

    窗口函數推薦教程http://www.aboutyun.com/thread-22652-1-1.html函數

    結合相關實例https://blog.csdn.net/dingchangxiu11/article/details/83145151oop

    開窗函數OVER用法介紹http://blog.csdn.net/sherri_du/article/details/53312085

                http://blog.csdn.net/qq_26937525/article/details/54925827

    窗口函數理解與實踐http://blog.csdn.net/xiepeifeng/article/details/42676567

    窗口函數與分析函數用法http://www.cnblogs.com/skyEva/p/5730531.html

                  http://blog.csdn.net/sunnyyoona/article/details/56484919

    PARTITON BY 與 ORDER BY語句很是重要:

      窗口函數和聚合函數不一樣的地方在於聚合函數每一個分組只產生一條記錄,而窗口函數則是每條記錄都會生成一條記錄

SQL 窗口查詢引入了三個新的概念:窗口分區、窗口幀、以及窗口函數。 PARTITION 語句會按照一個或多個指定字段,將查詢結果集拆分到不一樣的 窗口分區 中,並可按照必定規則排序。
若是沒有 PARTITION BY,則整個結果集將做爲單個窗口分區;
若是沒有 ORDER BY,咱們則沒法定義窗口幀,進而整個分區將做爲單個窗口幀進行處理。

  行列轉換https://www.cnblogs.com/dongxiucai/p/9784011.html

    lateral view的用法參考maxcomputer經常使用SQL小結

  2.自定義函數

    分類

      UDF  做用於單個數據行,產生一個數據行做爲輸出。(數學函數,字符串函數)

      UDAF(用戶定義彙集函數):接收多個輸入數據行,併產生一個輸出數據行。(count,max)

    自定義UDF:

    1.新建工程

      這裏選擇IDEA中創建普通的maven工程,若是不使用maven,則導入hive安裝包中Lib下除掉php、perl等的jar

    

 

     2.引入依賴

<dependency>   <groupId>org.apache.hive</groupId>   <artifactId>hive-exec</artifactId>   <version>1.2.1</version> </dependency>

  // 推薦保持和hadoop版本一致

    3.定義繼承於UDF的類,編寫evaluate()方法(必須是Public):

public class ToLowerCaseUDF extends UDF { public String evaluate(String src) { if (src == null) { return ""; } return src.toLowerCase(); } }

    若須要添加函數說明,使得能夠經過DESC查看,能夠添加如下註解(_FUNC_會替換爲函數名)

@Description(name = "deprecation", value = "_FUNC_(date, price) - from the input date string(yyyyMMdd), " + "returns the deprecation price by computing price and " + "the depreciation rate of the second-hand car.", extended = "Example:\n" + " > SELECT _FUNC_(date_string, price) FROM src;") public class TestUDF extends UDF {

    4.打成jar包

      使用maven的package打包,若是不使用IDEA的打包,能夠切換到項目根目錄,手動命令打包:

 mvn clean package

    5.上傳jar包

      這裏就使用rz上傳了

    6.使用UDF

       臨時:

          不過這個臨時函數, 其生命週期和hive的這個交互session保持一致, 一旦退出, 這個臨時函數就消失了.

0: jdbc:hive2://localhost:10000> add JAR /home/hadoop/hiveUDF.jar;

      // 在hive中上傳jar到hive的classpath 

create temporary function toprovince as 'com.jiangbei.ToLowerCaseUDF';

      //定義一個函數與UDF對應(as後接類的全路徑名),這裏手誤,函數名應該命令爲tolowercase

0: jdbc:hive2://localhost:10000> SELECT toprovince("HELLO"); +--------+--+ | _c0 | +--------+--+ | hello | +--------+--+ 1 row selected (0.613 seconds) 0: jdbc:hive2://localhost:10000> 
hive> DROP TEMPORARY FUNCTION IF EXISTS deprecation;

        //刪除函數

      永久:

        1. 把自定義函數的jar上傳到hdfs中.
            hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
        2. 建立永久函數
            hive> create function xxoo_lower as 'test.ql.LowerUDF' using jar 'hdfs:///path/to/hive_func/lower.jar'
        3. 驗證
            hive> select xxoo_lower("Hello World");
            hive> show functions;

        4.刪除

            hive> drop function xxoo_lower;

  //補充:處理JSON的內置函數:jason:

 

hive> select 
get_json_object(‘{「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」 } ‘,’$.owner’)
from dual;

 

  3.Transform   

    Hive的 TRANSFORM 關鍵字提供了在SQL中調用自寫腳本的功能

    適合實現Hive中沒有的功能又不想寫UDF的狀況

    實例:

CREATE TABLE u_data_new ( movieid INT, rating INT, weekday INT, userid INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'; add FILE weekday_mapper.py; INSERT OVERWRITE TABLE u_data_new SELECT TRANSFORM (movieid, rating, unixtime,userid) USING 'python weekday_mapper.py' AS (movieid, rating, weekday,userid) FROM u_data;
#!/bin/python import sys import datetime for line in sys.stdin: line = line.strip() movieid, rating, unixtime,userid = line.split('\t') weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() print '\t'.join([movieid, rating, str(weekday),userid])

 

      參考:http://blog.csdn.net/tianjun2012/article/details/64500499

相關文章
相關標籤/搜索