Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Airflow mysql to gcp Dag-Fehler

Laut Ihrer Rückverfolgung bricht Ihr Code bei dieser Punkt . Wie Sie sehen können, verarbeitet es den Code:

json.dump(row_dict, tmp_file_handle)

tmp_file_handle ist eine NamedTemporaryFile initialisiert mit Standardeingabeargumenten, das heißt, es simuliert eine mit w+b geöffnete Datei Modus (und akzeptiert daher nur byteartige Daten als Eingabe).

Das Problem ist, dass in Python 2 alle Strings Bytes sind, während in Python 3 Strings Texte sind (standardmäßig als utf-8 codiert ).

Wenn Sie Python 2 öffnen und diesen Code ausführen:

In [1]: from tempfile import NamedTemporaryFile
In [2]: tmp_f = NamedTemporaryFile(delete=True)
In [3]: import json
In [4]: json.dump({'1': 1}, tmp_f)

Es funktioniert gut.

Aber wenn Sie Python 3 öffnen und denselben Code ausführen:

In [54]: from tempfile import NamedTemporaryFile
In [55]: tmp_f = NamedTemporaryFile(delete=True)
In [56]: import json
In [57]: json.dump({'1': 1}, tmp_f)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-57-81743b9013c4> in <module>()
----> 1 json.dump({'1': 1}, tmp_f)

/usr/local/lib/python3.6/json/__init__.py in dump(obj, fp, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)
    178     # a debuggability cost
    179     for chunk in iterable:
--> 180         fp.write(chunk)
    181 
    182 

/usr/local/lib/python3.6/tempfile.py in func_wrapper(*args, **kwargs)
    481             @_functools.wraps(func)
    482             def func_wrapper(*args, **kwargs):
--> 483                 return func(*args, **kwargs)
    484             # Avoid closing the file as long as the wrapper is alive,
    485             # see issue #18879.

TypeError: a bytes-like object is required, not 'str'

Wir erhalten denselben Fehler wie bei Ihnen.

Das bedeutet, dass Airflow für Python 3 immer noch nicht vollständig unterstützt wird (wie Sie in der Testabdeckung , das Modul airflow/contrib/operators/mysql_to_gcs.py ist noch nicht getestet, weder in Python 2 noch 3). Eine Möglichkeit, dies zu bestätigen, wäre, Ihren Code mit Python 2 auszuführen und zu sehen, ob es funktioniert.

Ich würde empfehlen, ein Issue auf ihrem JIRA zu erstellen Bitte um Portabilität für beide Python-Versionen.