User-defined functions (UDFs) let you add your own special commands to process data in Hadoop. They help you do tasks that built-in commands cannot do easily.
User-defined functions (UDFs) in Hadoop
import org.apache.hadoop.hive.ql.exec.UDF; public class MyCustomUDF extends UDF { public String evaluate(String input) { if (input == null) return null; // Your custom logic here return input.toUpperCase(); } }
The class must extend UDF from Hadoop Hive.
The method evaluate is where you write your code. It can have different input types and return types.
import org.apache.hadoop.hive.ql.exec.UDF; public class ToUpperCaseUDF extends UDF { public String evaluate(String input) { if (input == null) return null; return input.toUpperCase(); } }
import org.apache.hadoop.hive.ql.exec.UDF; public class AddPrefixUDF extends UDF { public String evaluate(String input) { if (input == null) return null; return "prefix_" + input; } }
import org.apache.hadoop.hive.ql.exec.UDF; public class SafeDivideUDF extends UDF { public Double evaluate(Double numerator, Double denominator) { if (denominator == null || denominator == 0) return null; return numerator / denominator; } }
import org.apache.hadoop.hive.ql.exec.UDF; public class NullInputUDF extends UDF { public String evaluate(String input) { if (input == null) return "empty"; return input; } }
This program defines a UDF that reverses a string. It then tests the UDF with a normal string and a null input, printing the results.
import org.apache.hadoop.hive.ql.exec.UDF; public class ReverseStringUDF extends UDF { public String evaluate(String input) { if (input == null) return null; return new StringBuilder(input).reverse().toString(); } } // Sample usage in Hive: // CREATE TEMPORARY FUNCTION reverse_string AS 'ReverseStringUDF'; // SELECT reverse_string(name) FROM users; class TestReverseStringUDF { public static void main(String[] args) { ReverseStringUDF reverseStringUDF = new ReverseStringUDF(); String original = "hadoop"; System.out.println("Original: " + original); String reversed = reverseStringUDF.evaluate(original); System.out.println("Reversed: " + reversed); String nullInput = null; System.out.println("Null input reversed: " + reverseStringUDF.evaluate(nullInput)); } }
Time complexity is usually O(n) where n is the input size, depending on your logic.
Space complexity depends on what you store; simple UDFs use little extra space.
Common mistake: forgetting to handle null inputs, which can cause errors.
Use UDFs when built-in functions do not meet your needs or for reusable custom logic.
User-defined functions let you add your own data processing steps in Hadoop.
They must extend the UDF class and implement an evaluate method.
Always handle null inputs and test your UDF with different cases.
Practice
Solution
Step 1: Understand what UDFs do in Hadoop
UDFs allow users to write their own functions to process data beyond what built-in functions offer.Step 2: Compare options with UDF purpose
Only To add custom data processing logic not available in built-in functions describes adding custom data processing logic, which matches UDF use.Final Answer:
To add custom data processing logic not available in built-in functions -> Option AQuick Check:
UDF purpose = custom processing [OK]
- Confusing UDFs with storage or resource management
- Thinking UDFs handle system monitoring
- Assuming UDFs replace built-in functions entirely
Solution
Step 1: Recall UDF class requirements
Hadoop UDFs must extend the UDF class and implement the evaluate method to process input.Step 2: Match method names
Only evaluate() is the required method for UDF logic; others are incorrect or do not exist.Final Answer:
evaluate() -> Option CQuick Check:
UDF method = evaluate() [OK]
- Using initialize() or execute() instead of evaluate()
- Forgetting to override evaluate()
- Confusing with other Hadoop APIs
public class MyUDF extends UDF {
public String evaluate(String input) {
if (input == null) return "empty";
return input.toUpperCase();
}
}Solution
Step 1: Analyze input null check in evaluate()
The code checks if input is null and returns the string "empty" exactly as is.Step 2: Determine output for null input
Since input is null, the method returns "empty" (lowercase), not uppercase or error.Final Answer:
"empty" -> Option BQuick Check:
null input returns "empty" [OK]
- Assuming output is uppercase "EMPTY"
- Expecting null to be returned
- Thinking code throws an error on null
public class SampleUDF extends UDF {
public Integer evaluate(Integer num) {
return num + 10;
}
}Solution
Step 1: Review evaluate method logic
The method adds 10 to input num but does not check if num is null, which can cause NullPointerException.Step 2: Validate other options
Returning Integer is allowed; extending UDF is correct; method name evaluate is required.Final Answer:
Missing null check for input parameter -> Option DQuick Check:
Always check for null inputs in UDFs [OK]
- Ignoring null input checks
- Confusing return types for evaluate()
- Misunderstanding class inheritance rules
public Integer evaluate(String input) {
// Choose the correct code
}Solution
Step 1: Understand requirements for null or empty input
The method must return 0 if input is null or empty string, otherwise return string length.Step 2: Evaluate each option
if (input == null || input.isEmpty()) return 0; else return input.length(); correctly checks null or empty and returns 0; others either miss empty check or return wrong values.Final Answer:
if (input == null || input.isEmpty()) return 0; else return input.length(); -> Option AQuick Check:
Null or empty returns 0, else length [OK]
- Not checking for empty string
- Returning null instead of 0
- Adding extra 1 to length incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
