Как обработать "0000-00-00" в AWS Glue - pyspark

Я использую клей AWS для чтения таблиц AWS Aurora DB (MySQL) и записи в файлы S3. Таблица MySQL имеет значения столбца даты «0000-00-00», что разрешено в MySQL. Из-за этого моя работа Glue (PySpark) терпит неудачу. Как с этим справиться в коде Glue?

То, что я пробовал, но не удалось.

  1. Добавить jdbc:mysql:<host-name>/<db-name>?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8

  2. Удалите столбцы даты из DynamicFrame или Dataframe в коде PySpark. например: df.drop(df["date_column"])

  3. Столбец даты удален из определения таблицы Glue. Похоже, все столбцы в таблице прочитаны.

Сообщение об ошибке ниже

Traceback (most recent call last):
File "script_2018-08-03-21-41-06.py", line 107, in <module>
total_record_count=datasourceDF0.count()
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/pyspark.zip/pyspark/sql/dataframe.py", line 427, in count
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/pyspark.zip/pyspark/sql/utils.py", line 63, in deco
File "/mnt/yarn/usercache/root/appcache/application_1533330570684_0005/container_1533330570684_0005_01_000001/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o335.count.

: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 7.0 failed 4 times, most recent failure: Lost task 0.3 in stage 7.0 (TID 21, ip-172-24-120-182.us-west-2.compute.internal, executor 1): java.sql.SQLException: Value '0000-00-00' can not be represented as java.sql.Timestamp
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:996)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870)
at com.mysql.jdbc.ResultSetRow.getNativeTimestamp(ResultSetRow.java:606)
at com.mysql.jdbc.ByteArrayRow.getNativeTimestamp(ByteArrayRow.java:187)
at com.mysql.jdbc.ResultSetImpl.getNativeTimestamp(ResultSetImpl.java:4309)
at com.mysql.jdbc.ResultSetImpl.getTimestampInternal(ResultSetImpl.java:5929)
at com.mysql.jdbc.ResultSetImpl.getTimestamp(ResultSetImpl.java:5609)

person Kiran    schedule 04.08.2018    source источник
comment
github.com/ awesome-spark / spark-gotchas / blob / master /   -  person Alper t. Turker    schedule 05.08.2018
comment
Я уже пробовал это в Glue connection (# 1) и не смог. Спасибо. Статья оказалась полезной.   -  person Kiran    schedule 06.08.2018
comment
Вы пробовали отбросить data_column в функции преобразования ApplyMapping?   -  person cozyss    schedule 06.08.2018
comment
да. Я удалил date_column в преобразовании ApplyMapping. Это не работает. Я передаю только необходимые столбцы в ApplyMapping (). Обязательные столбцы содержат таблицу дат с датой 00. Даже если я удалю эти столбцы, я получаю сообщение об ошибке. Похоже, что метод glueContext.create_dynamic_frame.from_catalog () считывает все столбцы в таблицах MySQL и игнорирует таблицу, определенную в каталоге данных Glue.   -  person Kiran    schedule 07.08.2018


Ответы (1)


Проверьте формат, установленный для поля в схеме таблицы Crownler. Установите его на строку. Таким образом, у вас больше не будет ошибок синтаксического анализа. Выберите столбец с функцией df.selectExpr() и отформатируйте данные по своему усмотрению. Некоторые выражения Spark SQL:

person Marcel Bezerra    schedule 12.06.2019