pig_hook в потоке воздуха не работает для python3 - PullRequest
0 голосов
/ 02 июня 2018

Использование Python 3.5.2, воздушный поток 1.9.0

Попытка настроить крючок для свиньи, см. Документацию здесь: https://github.com/apache/incubator-airflow/blob/master/airflow/hooks/pig_hook.py

, следуя примеру в строках 50-52

    >>> ph = PigCliHook()
    >>> result = ph.run_cli("ls /;")
    >>> ("hdfs://" in result)

Выдает следующую ошибку:

  File "python3.5/site-packages/airflow/hooks/pig_hook.py", line 53, in run_cli
f.write(pig)
  File "python3.5/tempfile.py", line 622, in func_wrapper
return func(*args, **kwargs)
  TypeError: a bytes-like object is required, not 'str'

При обновлении для запуска:

    >>> ph = PigCliHook()
    >>> result = ph.run_cli("ls /;".encode('utf-8'))
    >>> ("hdfs://" in result)

Ошибка становится:

  File "python3.5/site-packages/airflow/hooks/pig_hook.py", line 74, in run_cli
stdout += line
  TypeError: Can't convert 'bytes' object to str implicitly

А позже в том же файле pig_hook.py он принимает строковый тип для этого поля, поэтому я не думаю, что передача входных данных как объекта в байтах является правильной.

Я считаю, что объект, вызывающий проблему,NamedTeditionalFile (из строки 52 в pig_hook.py), который открывается по умолчанию в режиме 'w + b', как описано в следующем сообщении:

https://bugs.python.org/issue29245

Но если я изменю строку 53в файле pig_hook.py для чтения:

with NamedTemporaryFile(dir=tmp_dir,'w') as f:

или

with NamedTemporaryFile(dir=tmp_dir, mode='w') as f:

он по-прежнему ожидает байтовый массив, приводящий к той же ошибке:

  File "python3.5/site-packages/airflow/hooks/pig_hook.py", line 53, in run_cli
f.write(pig)
  File "python3.5/tempfile.py", line 622, in func_wrapper
return func(*args, **kwargs)
  TypeError: a bytes-like object is required, not 'str'

Кто-нибудь знаеткак я могу решить эту проблему?Кажется, я не могу заставить NamedTeoraryFile открываться в режиме, который использует строку, а остальная часть кода принимает строку.

1 Ответ

0 голосов
/ 04 июня 2018

Оказывается, что ошибка после вызова:

>>> ph = PigCliHook()
>>> result = ph.run_cli("ls /;".encode('utf-8'))
>>> ("hdfs://" in result)

, которая была

File "python3.5/site-packages/airflow/hooks/pig_hook.py", line 74, in run_cli
stdout += line
TypeError: Can't convert 'bytes' object to str implicitly

, была не из моего собственного ввода, а из регистрации.Поэтому я добавил:

line = line.decode('utf-8')

к строке 75 pig_hook, и теперь она работает нормально.

...