Delen via


Integratie met Hive-UDF's, -UDAF's en -UDTF's

Van toepassing op:vinkje als ja aan Databricks Runtime

Spark SQL ondersteunt integratie van Hive UDF's, UDAF's en UDFS. Net als bij Spark UDF's en UDAF's werken Hive UDF's op een enkele rij als invoer en genereren zij één rij als uitvoer, terwijl Hive UDAF's op meerdere rijen werken en één samengevoegde rij als resultaat geven. Daarnaast biedt Hive ook ondersteuning voor UDDF's (door de gebruiker gedefinieerde tabellaire functies) die op één rij als invoer fungeren en meerdere rijen als uitvoer retourneren. Als u Hive UDF's/UDAFs/UTFs wilt gebruiken, moet de gebruiker deze registreren in Spark en deze vervolgens gebruiken in Spark SQL-query's.

Voorbeelden

Hive heeft twee UDF-interfaces: UDF en GenericUDF. Een voorbeeld hieronder maakt gebruik van GenericUDFAbs afgeleid van GenericUDF.

-- Register `GenericUDFAbs` and use it in Spark SQL.
-- Note that, if you use your own programmed one, you need to add a JAR containing it
-- into a classpath,
-- e.g., ADD JAR yourHiveUDF.jar;
CREATE TEMPORARY FUNCTION testUDF AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDFAbs';

SELECT * FROM t;
+-----+
|value|
+-----+
| -1.0|
|  2.0|
| -3.0|
+-----+

SELECT testUDF(value) FROM t;
+--------------+
|testUDF(value)|
+--------------+
|           1.0|
|           2.0|
|           3.0|
+--------------+

In een voorbeeld hieronder wordt GenericUDTFExplode gebruikt die is afgeleid van GenericUDTF.

-- Register `GenericUDTFExplode` and use it in Spark SQL
CREATE TEMPORARY FUNCTION hiveUDTF
    AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDTFExplode';

SELECT * FROM t;
+------+
| value|
+------+
|[1, 2]|
|[3, 4]|
+------+

SELECT hiveUDTF(value) FROM t;
+---+
|col|
+---+
|  1|
|  2|
|  3|
|  4|
+---+

Hive heeft twee UDAF-interfaces: UDAF en GenericUDAFResolver. Een voorbeeld hieronder maakt gebruik van GenericUDAFSum afgeleid van GenericUDAFResolver.

-- Register `GenericUDAFSum` and use it in Spark SQL
CREATE TEMPORARY FUNCTION hiveUDAF
    AS 'org.apache.hadoop.hive.ql.udf.generic.GenericUDAFSum';

SELECT * FROM t;
+---+-----+
|key|value|
+---+-----+
|  a|    1|
|  a|    2|
|  b|    3|
+---+-----+

SELECT key, hiveUDAF(value) FROM t GROUP BY key;
+---+---------------+
|key|hiveUDAF(value)|
+---+---------------+
|  b|              3|
|  a|              3|
+---+---------------+