У меня есть фрейм данных, который я прочитал из паркета со значением, подобным этому
+-----------------------+
|date_col |
+-----------------------+
|20000-01-03 00:00:000.0|
+-----------------------+
root
|-- date_col: timestamp (nullable = true)
Я пытаюсь отфильтровать неправильно отформатированные даты в отдельный фрейм данных, поэтому я запускаю его через эту функцию
def time_column_validation(df, col_name, df_err):
date_verification_udf = udf(date_verification, BooleanType())
df1 = df.filter(df[col_name].isNotNull()).filter(date_verification_udf(df[col_name]))
df2 = df1.withColumn('Error_desc', lit('Not date type'))
df_err = df2.union(df_err)
return df_err
def date_verification(date_col):
try:
if isinstance(date_col, datetime.datetime):
return False
else:
parse(date_col)
return False
except:
return True
err_df = time_column_validation(df, 'date_col', err_df)
err_df.show()
df - это мое datafame, показанное выше, err_df - это просто пустой фрейм данных с той же схемой. как это
+--------+
|date_col|
+--------+
+--------+
, но это не сработает в err_df.show (). Я думаю, что соответствующая ошибка заключается в следующем:
File "C:\spark-2.4.4-bin-hadoop2.7\python\lib\pyspark.zip\pyspark\sql\types.py", line 199, in fromInternal
return datetime.datetime.fromtimestamp(ts // 1000000).replace(microsecond=ts % 1000000)
OSError: [Errno 22] Invalid argument
Каким-то образом она не может обработать эту дату, но я не уверен, где это происходит или почему, дата существует в файле паркета, а исходный кадр данных просто хорошо. Ищите объяснение и / или предложение о том, как обрабатывать такое значение.
Мне все равно, будет ли эта конкретная дата отфильтрована или нет, я просто не хочу, чтобы код обрабатывал sh .