Подтвердить что ты не робот

Невозможно использовать существующий UUF Hive из Spark SQL

Я ранее зарегистрировал UDF с ульем. Это постоянный не TEMPORARY. Он работает в beeline.

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

У меня есть искра, сконфигурированная для использования метастара улья. Конфигурация работает так, как я могу запросить таблицы улей. Я вижу 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.                                |
+-------------------------------------------+

Однако я не могу использовать UDF в инструкции 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"

Если я попытаюсь зарегистрировать UDF с искру (минуя метастор), он не сможет зарегистрировать его, предположив, что он уже существует.

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

Я использую Spark 2.0, hiv metastore 1.1.0. UDF scala, мой код искрового драйвера - это python.

Я в тупике.

  • Я исхожу в своем предположении, что Spark может использовать постоянные UDF, определенные в метастаре?
  • Я правильно создаю функцию в улье?
4b9b3361

Ответ 1

Функция не может вызывать непосредственно в select (например, sql-сервере).

Вам нужно создать какую-нибудь туманную таблицу, такую ​​как оракул.

CREATE TABLE dual (фиктивная STRING);

загрузить данные local inpath '/path/to/textfile/dual.txt' переписать в таблицу dual;

SELECT normaliseURL ('значение') из двойного;

или

SELECT * from normaliseURL ('значение')

Ответ 2

Он будет работать на искру на среде пряжи, однако, как вам было предложено использовать искровую оболочку - jars.jar не в hdfs, а в локальном.

Ответ 3

Проблема: Spark 2.0 не может выполнять функции, чьи JAR находятся на HDFS.

Spark SQL: Thriftserver не может запустить зарегистрированный UUTF для улей

Одним из способов решения этой задачи является определение функции как временной функции в искровом задании с использованием пути jar, указывающего на локальный путь edge- node. Затем вызовите функцию в том же задании Spark.

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