Вычисление Первого дня предыдущего квартала в Spark SQL

#apache-spark #apache-spark-sql

#apache-spark #apache-spark-sql

Вопрос:

Как мне получить первый день последнего квартала, относящийся к любой заданной дате в запросе Spark-SQL, используя SQL API? Несколько необходимых примеров приведены ниже:

 input_date | start_date
------------------------
2020-01-21 | 2019-10-01
2020-02-06 | 2019-10-01
2020-04-15 | 2020-01-01
2020-07-10 | 2020-04-01
2020-10-20 | 2020-07-01
2021-02-04 | 2020-10-01
  

Кварталы обычно являются:

 1 | Jan - Mar
2 | Apr - Jun
3 | Jul - Sep
4 | Oct - Dec
  

Примечание: Я использую Spark SQL версии v2.4.

Приветствуется любая помощь. Спасибо.

Комментарии:

1. Каков ваш ожидаемый результат?

2. входные данные и их требуемый вывод приведены в моем вопросе

3. Ах … дата начала — это результат, и тогда это возможно. Do — 3 месяца и сокращение даты.

Ответ №1:

Используйте date_trunc с отрицанием 3 месяцев.

 df.withColumn("start_date", to_date(date_trunc("quarter", expr("input_date - interval 3 months"))))
  .show()

 ---------- ---------- 
|input_date|start_date|
 ---------- ---------- 
|2020-01-21|2019-10-01|
|2020-02-06|2019-10-01|
|2020-04-15|2020-01-01|
|2020-07-10|2020-04-01|
|2020-10-20|2020-07-01|
|2021-02-04|2020-10-01|
 ---------- ---------- 
  

Ответ №2:

Лично я бы создал таблицу с датами на ближайшие двадцать лет, используя Excel или что-то в этом роде, и просто сослался на эту таблицу.

Комментарии:

1. разве это невозможно каким-либо другим способом? Для. например, date_trunc(‘квартал’ …) и т.д., Чтобы найти первый месяц последнего квартала, а затем объединить ’01’ в конце, чтобы указать первый день?

2. Вероятно, я делал это примерно в дюжине разных систем на протяжении многих лет, и это никогда не подводило.