date_add / dateadd Функция типа Athena / Redshift для Spark sql - PullRequest
0 голосов
/ 18 июня 2020

Мне было интересно, есть ли какая-нибудь функция, похожая на athena / redshift date_add / dateadd, которую можно использовать для добавления миллисекунд к метке времени. Например, у меня есть значение временной метки как 2020-05-12 10:23:45 и нет миллисекундной части. Есть ли способ добавить миллисекунду к метке времени помимо использования ИНТЕРВАЛА? Пример Афины

date_add('millisecond', <column-with-bigint-data>, <column-with-timestamp-data-without-millisecond>)

Если у меня есть 2020-05-12 10:23:45 и 1115687, то добавление 1115687 к указанной выше метке времени в Афине дает мне 2020-05-12 10:23 : 45,687

1 Ответ

0 голосов
/ 18 июня 2020

Я достигал этого в прошлом, используя простой UDF. Лучшее в этом -

  • Легко настраиваемый лог c для сложения, вычитания или любой другой арифметической операции c операции
  • Поскольку getTime () возвращает миллисекунды с момента 1 января 1970 года вы можете использовать TimeUnit.Days.toMillis () в случае дней или аналогичных реализаций для обработки любого типа ввода. Как и в этом случае, мы принимаем миллисекунды в качестве входных.

Код -

import org.apache.spark.sql.functions.udf
import java.util.concurrent.TimeUnit
import java.util.Date
import java.text.SimpleDateFormat    

// Creating a UDF that takes DATE TIME & Time Interval as input 
val datetime_add = udf((x: String, y: Int) => {
    val datetimeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
    val result = new Date(datetimeformat.parse(x).getTime() + y)
  datetimeformat.format(result)
} )
//Creating a DataFrame with DateTime and 
val df = Seq((1, "2020-05-12 10:23:45", 5000), (2, "2020-11-11 12:12:12", 2000)).toDF("id", "DateTime", "miliseconds")

df.show()
//Creating a new column which will hold the new Time i.e the added time 
df.withColumn("new_Date", datetime_add($"DateTime", $"miliseconds")).show()

Выход -

enter image description here

Пожалуйста, дайте мне знать, отвечает ли это на ваш вопрос или нет. ВАЖНО - я запускаю этот фрагмент на Databricks.

Ссылки -

  1. https://docs.oracle.com/javase/8/docs/api/index.html?java / util / concurrent / TimeUnit. html
  2. https://www.tutorialspoint.com/java/util/date_gettime.htm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...