UnicodeDecodeError с MySQL в облачное хранилище Bug Airflow DAG

0

Я создал DAG, который извлекает данные MySQL из базы данных и загружает их в облачное хранилище, а затем BigQuery в виде json файлов.

DAG работает для определенных таблиц, но не для всех, потому что он не может декодировать определенные символы в таблицах. Это довольно много данных, поэтому я не могу точно указать, где находятся ошибки или недопустимые символы.

Я попытался изменить свои базы данных, таблицы и столбцы с utf8 на utf8mb4. Это не помогло.

Я также пробовал вызывать encoding = 'utf-8', а также 'iso-8859-1', как бы то ни было, я не думаю, что правильно их назову, потому что я делаю это с моим соединением, и я все еще получаю такая же ошибка.

Я запускаю Python 2.7.12 и airflow v1.8.0

Обновление: прочитав это: https://cwiki.apache.org/confluence/display/AIRFLOW/Common+Pitfalls, который предлагает использовать строку соединения, которая определяет кодировку, ex.:sql_alchemy_conn = mysql://airflow @localhost: 3306/расход воздуха? = UTF8 кодировка

Как это сделать с экземпляром Cloud SQL?

podio_connections = [
    'mysql_connection'
]

podio_tables = [
     'finance_banking_details',
     'finance_goods_invoices',
]

default_args = {
    'owner': 'xxxxxx',
    'start_date': datetime(2018,1,11),
    'depends_on_past': False,
    'retries': 2,
    'retry_delay': timedelta(minutes=5),
}

dag = DAG('mysql_to_bigquery', default_args=default_args, schedule_interval='@daily')

slack_notify = SlackAPIPostOperator(
    task_id='slack_notify',
    token='xxxxxx',
    channel='data-status',
    username='airflow',
    text='Successfully performed Podio ETL operation',
    dag=dag)

for connection in podio_connections:
    for table in podio_tables:
        extract = MySqlToGoogleCloudStorageOperator(
            task_id="extract_mysql_%s_%s"%(connection,table),
            mysql_conn_id=connection,
            google_cloud_storage_conn_id='gcp_connection',
            sql="SELECT *, '%s' as source FROM podiodb.%s"%(connection,table),
            bucket='podio-reader-storage',
            filename="%s/%s/%s{}.json"%(connection,table,table),            
            schema_filename="%s/schemas/%s.json"%(connection,table),
        dag=dag)

        load = GoogleCloudStorageToBigQueryOperator(
            task_id="load_bg_%s_%s"%(connection,table),
            bigquery_conn_id='gcp_connection',
            google_cloud_storage_conn_id='gcp_connection',
            bucket='podio-reader-storage',
            #destination_project_dataset_table="podio-data.%s.%s"%(connection,table),
            destination_project_dataset_table = "podio-data.podio_data1.%s"%(table),
            source_objects=["%s/%s/%s*.json"%(connection,table,table)],
            schema_object="%s/schemas/%s.json"%(connection,table),
            source_format='NEWLINE_DELIMITED_JSON',
            write_disposition='WRITE_TRUNCATE',
            dag=dag)

        load.set_upstream(extract)
        slack_notify.set_upstream(load)

[2018-01-12 15: 36: 10,221] {models.py:1417} ERROR - кодек 'utf8' не может декодировать байт 0x96 в позиции 36: недопустимый стартовый байт

Traceback (последний последний вызов):

Файл "/usr/local/lib/python2.7/dist-packages/airflow/models.py", строка 1374, в run result = task_copy.execute(context = context)

Файл "/usr/local/lib/python2.7/dist-packages/airflow/contrib/operators/mysql_to_gcs.py", строка 91, в файле execute_to_upload = self._write_local_data_files (курсор)

Файл "/usr/local/lib/python2.7/dist-packages/airflow/contrib/operators/mysql_to_gcs.py", строка 136, в _write_local_data_files json.dump(row_dict, tmp_file_handle)

Файл "/usr/lib/python2.7/json/init.py", строка 189, в дампе для фрагмента в истребителе:

Файл "/usr/lib/python2.7/json/encoder.py", строка 434, в _iterencode для фрагмента в _iterencode_dict (o, _current_indent_level):

Файл "/usr/lib/python2.7/json/encoder.py", строка 390, в файле _iterencode_dict yield _encoder (значение)

UnicodeDecodeError: кодек 'utf8' не может декодировать байт 0x96 в позиции 36: недопустимый стартовый байт

Теги:
airflow
utf-8

1 ответ

2
Лучший ответ

96 - латинское шестнадцатеричное значение для "en-dash". Либо измените данные на utf8, либо измените соединение с MySQL, чтобы сказать, что вы используете charset latin1.

  • 0
    Спасибо @Рик Джеймс, это сработало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню