Я создал 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: недопустимый стартовый байт
96
- латинское шестнадцатеричное значение для "en-dash". Либо измените данные на utf8, либо измените соединение с MySQL, чтобы сказать, что вы используете charset latin1.