1. 程式人生 > >0011-如何在Hive & Impala中使用UDF

0011-如何在Hive & Impala中使用UDF

溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。

1.文件編寫目的

本文件講述如何開發Hive自定義函式(UDF),以及如何在Impala中使用Hive的自定義函式,通過本文件,您將學習到以下知識:

1.如何使用Java開發Hive的自定義函式

2.如何在Hive中建立自定義函式及使用

3.如何在Impala中使用Hive的自定義函式

這篇文件將重點介紹UDF在Hive和Impala的使用,並基於以下假設:

1.叢集環境正常執行

2.叢集安裝Hive和Impala服務

以下是本次測試環境,但不是本操作手冊的硬限制:

1.作業系統:Redhat6.5

2.CDH和CM版本為5.11.1

3.採用sudo許可權的ec2-user使用者進行操作

2.UDF函式開發

使用Intellij工具開發Hive的UDF函式,進行編譯;

1.使用Intellij工具通過Maven建立一個Java工程

2.pom.xml檔案中增加Hive包的依賴

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

3.Java示例程式碼如下

package com.peach.date;

import org.apache.hadoop.hive.ql.exec.UDF;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * SQL的UDF日期相關工具類
 * Created by peach on 2017/8/24.
 */
public class DateUtils extends UDF {
 /**
     * 將日期字串格式化為標準的日期格式
     * 如:
     * 2017-8-9 to 2017-08-09
     * 2017-08-09 9:23:3 to 2017-08-0909:23:03
     * @param sdate
 * @param pattern
 * @return
 */
 public static String evaluate(Stringsdate, String pattern) {
        String formatDate = sdate;
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            formatDate =sdf.format(sdf.parse(sdate));
 } catch (ParseException e) {
            e.printStackTrace();
 }
 return formatDate;
 }
}

此處使用一個簡單的日期轉換自定義函式來做事例,注意此處需要整合UDF類,重寫evaluate方法,來實現自己定義函式。

4.編譯jar包

前提條件是已配置Maven的環境變數,命令列進入工程目錄,執行如下命令:

| mvn clean package |

|:----|

3.Hive使用自定義函式(UDF)

將章節2中編譯好的sql-udf-utils-1.0-SNAPSHOT.jar上傳到叢集伺服器;

3.1建立臨時UDF

1.進入Hive的shell命令列,執行如下命令,建立臨時函式

| add jar /home/ec2-user/sql-udf-utils-1.0-SNAPSHOT.jar;create temporary function parse_date as ‘com.peach.date.DateUtils’; |

|:----|

2.在命令列測試該UDF函式

| select parse_date(dates, ‘yyyy-MM-dd HH:mm:ss’) from date_test1; |

|:----|

3.2建立永久UDF

1.在HDFS中建立相應目錄,將sql-udf-utils-1.0-SNAPSHOT.jar包上傳至該目錄

| [email protected] ~$ hadoop dfs -mkdir /[email protected] ~$ hadoop dfs -put sql-udf-utils-1.0-SNAPSHOT.jar /udfjar |

|:----|

注意:目錄udfjar和sql-udf-utils-1.0-SNAPSHOT.jar的許可權,所屬使用者為hive

2.進入Hive的shell命令列,執行如下命令建立永久的UDF

| create function default.parse_date as ‘com.peach.date.DateUtils’ using jar ‘hdfs://ip-172-31-9-186.ap-southeast-1.compute.internal:8020/udfjar/sql-udf-utils-1.0-SNAPSHOT.jar’; |

|:----|

注意:在建立的時候如果帶有資料庫名,則該UDF函式只對該庫生效,其它庫無法使用該UDF函式。

3.在命令列測試該UDF

| select parse_date(dates, ‘yyyy-MM-dd HH:mm:ss’) from date_test1; |

|:----|

4.驗證永久UDF函式是否生效

重新開啟Hive CLI能正常使用建立的UDF函式。

4.Impala使用Hive的UDF

1.在Impala shell命令列執行元資料同步命令

| ip-172-31-10-156.ap-southeast-1.compute.internal:21000 > invalidate metadata; |

|:----|

2.使用UDF函式

| ip-172-31-10-156.ap-southeast-1.compute.internal:21000 > select parse_date(dates,‘yyyy-MM-dd HH:mm:ss’) from date_test1; |

|:----|

5.常見問題

1.通過Impala CLI命令列,使用UDF自定義函式時異常

| Connected to ip-172-31-10-156.ap-southeast-1.compute.internal:21000Server version: impalad version 2.7.0-cdh5.10.2 RELEASE (build 38c989c0330ea952133111e41965ff9af96412d3)ip-172-31-10-156.ap-southeast-1.compute.internal:21000 > select parse_date(dates) from date_test1;Query: select parse_date(dates) from date_test1Query submitted at: 2017-08-24 12:51:44 (Coordinator: http://ip-172-31-10-156.ap-southeast-1.compute.internal:25000)ERROR: AnalysisException: default.parse_date() unknown |

|:----|

元資料未同步導致,執行如下命令進行元資料同步:

| ip-172-31-10-156.ap-southeast-1.compute.internal:21000 > invalidate metadata; |

|:----|

2.在Impala CLI命令列執行,異常如下

| ip-172-31-10-156.ap-southeast-1.compute.internal:21000 > select parse_date(dates,‘yyyy-MM-dd HH:mm:ss’) from date_test1;Query: select parse_date(dates,‘yyyy-MM-dd HH:mm:ss’) from date_test1Query submitted at: 2017-08-24 13:02:14 (Coordinator: http://ip-172-31-10-156.ap-southeast-1.compute.internal:25000)ERROR: Failed to copy hdfs://ip-172-31-9-186.ap-southeast-1.compute.internal:8020/udfjar/sql-udf-utils-1.0-SNAPSHOT.jar to /var/lib/impala/udfs/sql-udf-utils-1.0-SNAPSHOT.2386.2.jar:Error(2): No such file or directory |

|:----|

在Impala Daemon伺服器上,目錄不存在導致

解決方法:

在所有Impala Daemon伺服器建立/var/lib/impala/udfs目錄

| [email protected] lib$ sudo mkdir -p impala/[email protected] lib$ sudo chown -R impala:impala impala/ |

|:----|

注意:目錄所屬使用者及組

溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。