Theo dấu vết của bạn, mã của bạn đang bị hỏng tại điểm này . Như bạn có thể thấy, nó xử lý mã:
json.dump(row_dict, tmp_file_handle)
tmp_file_handle
là một NamedTemporaryFile
được khởi tạo
với args đầu vào mặc định, nghĩa là, nó mô phỏng một tệp được mở bằng w+b
(và do đó chỉ chấp nhận dữ liệu dạng byte làm đầu vào).
Vấn đề là trong Python 2, tất cả các chuỗi đều là byte trong khi trong Python 3 chuỗi là văn bản (được mã hóa theo mặc định là utf-8
).
Nếu bạn mở Python 2 và chạy mã này:
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)
Nó hoạt động tốt.
Nhưng nếu bạn mở Python 3 và chạy cùng một mã:
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'
Chúng tôi gặp lỗi tương tự như lỗi của bạn.
Điều này có nghĩa là Airflow vẫn chưa được hỗ trợ đầy đủ cho Python 3 (như bạn có thể thấy trong vùng phủ sóng thử nghiệm
, mô-đun airflow/contrib/operators/mysql_to_gcs.py
chưa được thử nghiệm trong python 2 hoặc 3). Một cách để xác nhận điều này là chạy mã của bạn bằng python 2 và xem nó có hoạt động không.
Tôi khuyên bạn nên tạo sự cố trên JIRA của họ yêu cầu tính di động cho cả hai phiên bản Python.