We can extend and have custom Hive using the User Defined Functions (UDFs). To demonstrate the process let us look at the below example.
Prerequisites for Custom Hive
- We have to extend “our class” to the UDF abstract class.
- “Our Class” must have at leas one evaluate () method. evaluate () method is not the method of UDF abstract class. This evaluate() method should have at least one parameter.
- Compile the above java file and create the JAR file for keeping the .class file.
- Add JAR file to hive classpath.
- Create temporary function.
Problem Statement
Find the maximum marks obtained out of four subjects by a student.
Step 1:
Create a table STUDENTS_RECORDS with below sample record.
SID | NAME | CLASS | MATH | PHYSICS | ENGLISH | CSC | TOT_MARKS |
1 | MAK | 10 | 85 | 95 | 86 | 92 | 358 |
2 | TANUL | 10 | 85 | 85 | 100 | 95 | 377 |
3 | JHON | 10 | 92 | 98 | 82 | 90 | 362 |
Step 2:
Create a new project say “hiveudf” in package explorer of the Eclipse IDE.
Add the required JAR files by going in Libraries tab of the eclipse.
Choose “Add External JARs…”. The main JAR file which we need to add is “hadoop-core.jar”.
Also, add hive related JAR files. All the hive related JAR files will be there in /hive/lib folder.
Step 3:
Create a class for the “hiveudf” by right clicking on the project.
Package Name: “com.hadoop.hive”
Class Name: “GetMaxMarks”.
Step 4:
Write code as below:
package com.hadoop.hive; import org.apache.hadoop.hive.ql.exec.UDF; public class GetMaxMarks extends UDF{ public double evaluate (double math,double eng,double physics,double csc) { double maxMarks=math; if(eng>maxMarks) { maxMarks = eng; } if(physics>maxMarks) { maxMarks=physics; } if(csc>maxMarks) { maxMarks=csc; } return maxMarks; } }
Step 5:
Create the JAR file for the above class. Right-click on the project -> Export -> JAR -> Next -> Put the JAR file name as “hive-maxmarks.jar”
Step 6:
Add JAR file to hive classpath.
hive> add jar /home/training/workspace/hive-maxmarks.jar
Step 7:
In order to apply business logic on top of hive column using our UDF, we need to create a temporary function for the exported jar file.
Hive> CREATE temporary function func_name as com.hadoop.hive.GetMaxMarks --'absolute_class_path_name'.
Step 8:
Apply this UDF/function on your table.
Hive> SELECT sid, name,GetMaxMarks(math, eng, physics,csc) from STUDENTS_RECORDS;