Développement et utilisation d'une UDF Hive de conversion de dates

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.

  1. 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>
  1. 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);
    }
}
  1. 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.

  1. 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';
  1. 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.

Étiquettes: Hive UDF Hadoop Maven hql

Publié le 17 septembre à 02h16