Ошибка при записи даты от искры до эластичного поиска из-за длины метки времени - PullRequest
0 голосов
/ 29 января 2020

Я получаю ошибку при записи данных вasticsearch от spark. Большинство документов написано нормально, поэтому у меня есть исключения такого типа

org.elasticsearch.had oop .rest.EsHadoopRemoteException: date_time_exception: date_time_exception: недопустимое значение для года (допустимые значения -999999999 - 999999999 ): -6220800000

  • Отображение поля в эластичном поиске - «дата»

  • Тип поля в pySpark - DateType, а не TimestampType, который ИМО должен дать понять, что это дата без времени. Значение, показанное искрой, равно «1969-10-21», поэтому вполне разумная дата.

(Первоначально это был timestampType из другого чтения даты из эластичного поиска, но я преобразовал его в dateType в надежде решить эту ошибку, но у меня точно такое же сообщение об ошибке (с точно таким же значением метки времени), либо отправка вasticSearch TimestampType или DateType)

Я предполагаю, что есть три 0, которые не должны быть в тот момент времени, отправленный эластичному поиску, но я не могу найти способ его нормализовать. Есть ли опция для разъема org.elasticsearch.had oop?

(версия elk - 7.5.2, spark - 2.4.4)

1 Ответ

0 голосов
/ 30 января 2020

Очевидное решение: используйте любой другой тип, кроме TimestampType или DateType

, например, используйте этот udf для LongType (чтобы продемонстрировать, что это действительно проблема длины метки времени).

import datetime
import time

def conv_ts(d) :
  return time.mktime(d.timetuple())
ts_udf = F.udf(lambda z : int(conv_ts(z)), LongType())

(Примечание что в этом фрагменте искровым вводом является timestampType, а не dateType, поэтому python datetime, а не date, потому что я тоже пытался возиться с преобразованиями времени)

ИЛИ (гораздо более эффективный способ), очевидно, чтобы избежать udf используя поле форматированной даты StringType вместо длинной метки времени благодаря функции pyspark.sql.date_format.

Решение, но не совсем удовлетворительное, я бы скорее понял, почему коннектор не работает должным образом с timestampTypes и dateTypes путем соответствующей корректировки длины метки времени.

...