Cet article montre comment implémenter une fnoction utilisateur (UDF) Hive en Java pour convertir une chaîne de caractères d'un format de date à un autre, puis comment l'utiliser dans HQL.
- Créasion du projet Maven
Créez un projet Maven avec l'artefact suivant et adaptez les versions aux dépendances de votre cluster. L'exemple ci-dessous suppose Hadoop 2.7.7 et Hive 1.2.2.
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.hive</groupId>
<artifactId>date-udf</artifactId>
<version>1.0.0</version>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.7</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.2</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
- Classe Java de l'UDF
La classe hérite de org.apache.hadoop.hive.ql.exec.UDF. Elle exploite les API temps de Java 8 pour effectuer la conversion.
package com.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class DateFormatTransformer extends UDF {
public Text evaluate(Text source, Text inPattern, Text outPattern) {
if (source == null || inPattern == null || outPattern == null) {
return null;
}
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inPattern.toString());
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outPattern.toString());
LocalDateTime dateTime = LocalDateTime.parse(source.toString(), inputFormatter);
String formatted = dateTime.format(outputFormatter);
return new Text(formatted);
}
}
- Construction du JAR
Compilez et packagez le projet avec Maven :
mvn clean package
Le fichier généré, date-udf.jar, est ensuite déployé sur le cluster, par exemple dans /opt/hive-udfs/date-udf.jar.
- Enregistrement de la fonction dans Hive
Ouvrez une session Hive et chargez le JAR avant de déclarer la fonction temporaire.
ADD JAR /opt/hive-udfs/date-udf.jar;
CREATE TEMPORARY FUNCTION format_date
AS 'com.example.hive.udf.DateFormatTransformer';
- Utilisation dans une requête HQL
Imaginons une table nommée logs contenant les dates au format compact.
SELECT format_date(log_time, 'yyyyMMddHHmmss', 'yyyy-MM-dd HH:mm:ss')
FROM logs;
Données d'entrée :
20190529072650
20190529072730
20190529072812
Résultat de l'UDF :
2019-05-29 07:26:50
2019-05-29 07:27:30
2019-05-29 07:28:12
La fonction temporaire reste disponible uniquement pendant la session Hive en cours.