Добавление переменных часов к метке времени в Spark SQL - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть один столбец Start_Time с отметкой времени и один столбец Time_Zone_Offset, целое число. Как добавить Time_Zone_Offset в Start_Time в виде количества часов?

Пример MyTable:

id  Start_Time            Time_Zone_Offset

1   2020-01-12 00:00:00     1
2   2020-01-12 00:00:00     2

Желаемый вывод:

id  Local_Start_Time

1   2020-01-12 01:00:00
2   2020-01-12 02:00:00

Попытка:

SELECT id, Start_time + INTERVAL time_zone_offset HOURS AS Local_Start_Time
FROM MyTable

Кажется, это не работает, и я не могу использовать from_utc_timestamp, так как у меня нет фактической информации о часовом поясе, только смещение часового пояса в рассматриваемый момент.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Добавление альтернативы ответу Бенуа, используя python UDF:

from pyspark.sql import SQLContext
from datetime import datetime, timedelta
from pyspark.sql.types import TimestampType

# Defining pyspark function to add hours onto datetime
def addHours(my_datetime, hours):
    # Accounting for NULL (None in python) values
    if (hours is None) or (my_datetime is None):
        adjusted_datetime = None
    else:
        adjusted_datetime = my_datetime + timedelta(hours = hours)
    return adjusted_datetime

# Registering the function as a UDF to use in SQL, and defining the output type as 'TimestampType' (this is important, the default is StringType)
sqlContext.udf.register("add_hours", addHours, TimestampType());

с последующим:

SELECT id, add_hours(Start_Time, Time_Zone_Offset) AS Local_Start_Time
FROM MyTable
0 голосов
/ 13 февраля 2020

(Надеюсь, вы используете pyspark)

На самом деле, я не могу заставить его работать с SQL, мне удается получить результат путем преобразования в метку времени, это, вероятно, не лучший способ, но это работает (я продолжил шаг за шагом, чтобы убедиться, что ссылки работали, думал, что мне понадобится пользовательская функция, но, видимо, нет)

from pyspark.sql.functions import col,explode,lit
from pyspark.sql import functions as F
df2 = df.withColumn("Start_Time", F.unix_timestamp("Start_Time"))
df2.show()
df3 = df.withColumn("Start_Time", F.unix_timestamp("Start_Time") + df["Time_Zone_Offset"]*60*60)
df3.show()
df4 = df3.withColumn('Start_Time', F.from_unixtime("Start_Time", "YYYY-MM-DD HH:00:00")).show()
...