Как использовать Python UDF для Hive в качестве встроенного кода без файла скрипта - PullRequest
0 голосов
/ 25 марта 2019

Я использую пакет Python impyla для программного подключения к Hive;Я не использую hive CLI.И я пытаюсь использовать UDF, написанный на Python.

Все учебники, которые я видел, делают это следующим образом

ADD FILE myscript.py;
...
SELECT TRANSFORM (cols...)
USING 'python myscript.py'
AS ...

Я думал, что часть USING может быть любой исполняемой программойэто правильно делает.В связи с этим я подумал, что мог бы отправить скрипт на лету в виде строки, такой как

USING 'python -c "import sys; ..."'

Это позволит избежать передачи файлов в Hadoop.Однако у меня проблемы с тем, чтобы заставить это работать.

После того, как полезный код не сработал, я сократил этот фиктивный код

USING 'python -c "print 3"

только для отладки.Я получаю ошибку:

E           impala.error.HiveServer2Error: Error while compiling statement: FAILED: IllegalArgumentException Can not create a Path from an empty string

Более подробная информация:

test_hive_udf_example.py:77: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../../src/sunny/sql/hive.py:80: in read
    return super().read(sql, configuration=config)
../../src/sunny/sql/sql.py:136: in read
    self._execute(sql, **kwargs)
../../src/sunny/sql/sql.py:130: in _execute
    self._cursor.execute(sql, **kwargs)
/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py:302: in execute
    configuration=configuration)
/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py:343: in execute_async
    self._execute_async(op)
/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py:362: in _execute_async
    operation_fn()
/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py:340: in op
    async=True)
/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py:1027: in execute
    return self._operation('ExecuteStatement', req)
/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py:957: in _operation
    resp = self._rpc(kind, request)
/usr/local/lib/python3.6/dist-packages/impala/hiveserver2.py:925: in _rpc
    err_if_rpc_not_ok(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

resp = TExecuteStatementResp(status=TStatus(statusCode=3, infoMessages=None, sqlState='42000', errorCode=40000, errorMessage=...mpiling statement: FAILED: IllegalArgumentException Can not create a Path from an empty string'), operationHandle=None)

    def err_if_rpc_not_ok(resp):
        if (resp.status.statusCode != TStatusCode.SUCCESS_STATUS and
                resp.status.statusCode != TStatusCode.SUCCESS_WITH_INFO_STATUS and
                resp.status.statusCode != TStatusCode.STILL_EXECUTING_STATUS):
>           raise HiveServer2Error(resp.status.errorMessage)
E           impala.error.HiveServer2Error: Error while compiling statement: FAILED: IllegalArgumentException Can not create a Path from an empty string

Похоже, что он жалуется на то, что ищет скрипт, о котором мой код не упоминалвсе.

Когда я выполнял этот сценарий с помощью hive CLI вместо impyla, я убедился, что использование сценария не требуется синтаксисом.USING 'python -c "..."' может работать.

Теперь, похоже, проблема в том, как я использую его через impyla.

Любой указатель приветствуется!Спасибо!

...