SparkSQL: игнорировать / конвертировать строки с неверным форматом даты - PullRequest
1 голос
/ 10 октября 2019

У меня есть таблица с именем столбца 'date1' (отметка времени (nullable = true)), отформатированная так:

scala> sql("select date1 from tablename).show(20);
+-------------------+
|        date1      |
+-------------------+
|2016-08-20 00:00:00|
|2016-08-31 00:00:00|
|2016-08-31 00:00:00|
|2016-09-09 00:00:00|
|2016-09-08 00:00:00|

При чтении полной таблицы улья я получаю следующую ошибку:

WARN TaskSetManager: Lost task 2633.0 in stage 4.0 (TID 7206, ip-10-0-0-241.ec2.internal, executor 11): TaskKilled (stage cancelled)
org.apache.spark.SparkException: Job aborted due to stage failure: Task 80 in stage 4.0 failed 4 times, most recent failure: Lost task 80.3 in stage 4.0 (TID 8944, ip-10-0-0-241.ec2.internal, executor 42): java.time.format.DateTimeParseException: Text '0000-12-30T00:00:00' could not be parsed, unparsed text found at index 10
.....
.....
Caused by: java.time.format.DateTimeParseException: Text '0000-12-30T00:00:00' could not be parsed, unparsed text found at index 10
  at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1952)

Как я могу игнорировать / преобразовывать записи, чтобы я мог читать таблицы?

SparkVersion: 2.2.1

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Вы можете попробовать, как показано ниже

spark.sql ("" "выбрать приведение (regexp_replace (date1, '[T, Z]', '') как метка времени) из имени таблицы" ""). Show()

Это заменит T / Z на '' (пробел), когда найдет, в противном случае он ничего не сделает.

Надеюсь, это поможет!

0 голосов
/ 10 октября 2019

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

scala> sql("select date1 from tablename).write.mode("overwrite").parquet("path/to/file.parquet")

Если проблема связана с этим столбцом, вы получите ошибку.

Вы пытаетесь запросить исходные данные, используя'0000-12-30T00: 00: 00'

Это явно проблема с данными, которую необходимо идентифицировать и удалить.

Вы можете попробовать выполнить запрос ниже, чтобы игнорировать строки

sql("select date1 from tablename where date1 <> '0000-12-30T00:00:00'").count
...