Как конфертировать из десятичной в дату в scala select? - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть объект столбца datetime, объявленный как десятичный (38,0), а не как отметка времени или дата, а ввод данных - «yyyMMdd». Как выбрать данные в этом столбце для преобразования в формате даты как «гггг-ММ-дд» в spark sql (scala) в течение дня или двух дней?

Я пробовал:

select count(*) from table_name where to_date('column_name','yyyy-MM-dd') = date_sub(current_date(),1));

это дает мне счет 0, когда данные имеют более 500000 записей

Я пытался:

select count(*) from table_name where from_unixtime(cast(load_dt_id as string), 'yyyy-MM-dd') = date_sub(current_date(), 1));

Я получил данные в 1970-01-31 годах, которые эти данные за год отсутствуют в таблице, даже когда я выбрал этот столбец, где он выглядит как «1970%», я получил «ОК» со значком, ускоряющим запрос с помощью Delta. Выбор данных в порядке этого столбца начался с 20140320

1 Ответ

2 голосов
/ 10 февраля 2020

Аргументом формата для to_date является формат ввода , а не требуемый вывод. Предполагая, что у вас есть ггггммдд:

Seq(("20200208")).toDF("RawDate").select(col("RawDate"),to_date(col("RawDate"),"yyyyMMdd").as("formatted_date")).show()
+--------+--------------+
| RawDate|formatted_date|
+--------+--------------+
|20200208|    2020-02-08|

+ -------- + -------------- +

Расширение для фильтрации по столбец производной даты:

val raw = Seq(("20200208"),("20200209"),("20200210")).toDF("RawDate")
raw: org.apache.spark.sql.DataFrame = [RawDate: string]

raw.select(col("RawDate"),to_date(col("RawDate"),"yyyyMMdd").as("formatted_date")).filter($"formatted_date".geq(date_add(current_date,-1))).show
+--------+--------------+
| RawDate|formatted_date|
+--------+--------------+
|20200209|    2020-02-09|
|20200210|    2020-02-10|
+--------+--------------+
...