apache-spark hive apache-spark-sql udf

apache spark - No se puede usar una UDF permanente permanente de Hive de Spark SQL



apache-spark apache-spark-sql (3)

El problema es que Spark 2.0 no puede ejecutar las funciones cuyos archivos JAR están ubicados en HDFS.

Spark SQL: Thriftserver no puede ejecutar un UDTF de Hive registrado

Una solución consiste en definir la función como una función temporal en el trabajo de chispa con la ruta de jar apuntando a una ruta de nodo de borde local. Luego llame a la función en el mismo trabajo Spark.

CREATE TEMPORARY FUNCTION functionName as ''com.test.HiveUDF'' USING JAR ''/user/home/dir1/functions.jar''

He registrado previamente un UDF con colmena. Es permanente, no TEMPORARY . Funciona en beeline.

CREATE FUNCTION normaliseURL AS ''com.example.hive.udfs.NormaliseURL'' USING JAR ''hdfs://udfs/hive-udfs.jar'';

Tengo una chispa configurada para usar el metastore de la colmena. La configuración funciona, ya que puedo consultar tablas de colmenas. Puedo ver el UDF;

In [9]: spark.sql(''describe function normaliseURL'').show(truncate=False) +-------------------------------------------+ |function_desc | +-------------------------------------------+ |Function: default.normaliseURL | |Class: com.example.hive.udfs.NormaliseURL | |Usage: N/A. | +-------------------------------------------+

Sin embargo, no puedo usar el UDF en una declaración sql;

spark.sql(''SELECT normaliseURL("value")'') AnalysisException: "Undefined function: ''default.normaliseURL''. This function is neither a registered temporary function nor a permanent function registered in the database ''default''.; line 1 pos 7"

Si intento registrar el UDF con chispa (pasando por alto el metastore) no se puede registrar, lo que sugiere que ya existe.

In [12]: spark.sql("create function normaliseURL as ''com.example.hive.udfs.NormaliseURL''") AnalysisException: "Function ''default.normaliseURL'' already exists in database ''default'';"

Estoy usando Spark 2.0, hive metastore 1.1.0. El UDF es scala, mi código de chispa es python.

Estoy perplejo.

  • ¿Estoy en lo cierto al suponer que Spark puede utilizar UDF permanentes definidas en metastore?
  • ¿Estoy creando la función correctamente en colmena?

Funciona en chispa en el entorno de hilo, sin embargo, como se sugiere, debe utilizar chispa -jar --jars .jar no en hdfs, sino en local.


No se puede llamar directly en select (como servidor sql).

Tienes que crear una tabla dumy como oráculo.

CREATE TABLE dual (Dummy STRING);

load data local inpath ''/path/to/textfile/dual.txt'' sobreescribe en la tabla dual;

SELECCIONE normaliseURL (''valor'') desde dual;

o

SELECT * from normaliseURL (''valor'')