Как разобрать строку даты и времени в твиттере в pyspark? - PullRequest
0 голосов
/ 03 мая 2019

Мои данные находятся в фрейме данных pyspark ('pyspark.sql.dataframe.DataFrame').В одном из столбцов дата хранится в формате строки Twitter.

Я нашел пару решений для python, но для pyspark нет конкретного решения.

Вот так выглядит столбец.

+------------------------------+----+
|created_at(string format)     |date|
+------------------------------+----+
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
|Tue Mar 26 02:29:54 +0000 2019|null|
+------------------------------+----+

Я попробовал следующее решение, но оно не сработало

date_df = df.select('created_at', from_unixtime(unix_timestamp('created_at', '%a %b %d %H:%M:%S %z %Y')).alias('date'))

Мне нужно преобразовать столбец в искровой тип даты / времени, чтобы я мог выполнить другие даты и времяОперации spark.sql поверх него.

1 Ответ

0 голосов
/ 17 мая 2019

Я не смог заставить работать любое решение. Очевидно, функция to_timestamp() на pyspark.sql читает ввод в определенном формате. Все попытки предоставить формат не дали результатов. Следовательно, использование UDF (пользовательская функция) было неизбежно. Но нужно отметить, что функция не может возвращать дату и время Python. Так что теперь это должен быть двухэтапный процесс.

  1. UDF для анализа строки даты, преобразования формата и возврата строки, совместимой с to_timestamp()
  2. Использование to_timestamp() для преобразования типа данных в фрейм данных spark
from datetime import datetime
import pytz
from pyspark.sql.functions import udf, to_date, to_utc_timestamp

## Converting date string format
def getDate(x):
    if x is not None:
        return str(datetime.strptime(x,'%a %b %d %H:%M:%S +0000 %Y').replace(tzinfo=pytz.UTC).strftime("%Y-%m-%d %H:%M:%S"))
    else:
        return None

## UDF declaration
date_fn = udf(getDate, StringType())

## Converting datatype in spark dataframe
df = df.withColumn("created_at", to_utc_timestamp(date_fn("created_at"),"UTC")) 
...