Извлечь номер дня недели из строкового столбца (отметка даты и времени) в Spark API

Я новичок в Spark API. Я пытаюсь извлечь номер дня недели из столбца, например col_date (с отметкой даты и времени, например, «13AUG15: 09: 40: 15»), которая является строкой, и добавить еще один столбец в качестве дня недели (целое число). Я не умею делать это успешно.


person user6200992    schedule 27.04.2016    source источник
comment
Возможный дубликат Как узнать день недели в SparkSQL?   -  person Matt Raines    schedule 27.04.2016
comment
Вы используете RDD или DataFrames?   -  person Galen Long    schedule 28.04.2016
comment
@nightingalen: я использую фрейм данных   -  person user6200992    schedule 28.04.2016


Ответы (2)


Что ж, это довольно просто.

Эта простая функция выполняет всю работу и возвращает число дней недели (понедельник = 1):

from time import time
from datetime import datetime

# get weekdays and daily hours from timestamp
def toWeekDay(x):
#     v = datetime.strptime(datetime.fromtimestamp(int(x)).strftime("%Y %m %d %H"), "%Y %m %d %H").strftime('%w') - from unix timestamp
    v = datetime.strptime(x, '%d%b%y:%H:%M:%S').strftime('%w')
    return v

days = ['13AUG15:09:40:15','27APR16:20:04:35'] # create example dates
days = sc.parallelize(days) # for example purposes - transform python list to RDD so we can do it in a 'Spark [parallel] way'
days.take(2) # to see whats in RDD
> ['13AUG15:09:40:15', '27APR16:20:04:35']

result = v.map(lambda x: (toWeekDay(x))) # apply functon toWeekDay on each element of RDD
result.take(2) # lets see results
> ['4', '3']

Дополнительные сведения об обработке даты и времени см. В документации Python.

person Matus Cimerman    schedule 28.04.2016
comment
Я забыл важную часть, .strftime ('% w') делает волшебство и возвращает номер дня недели. - person Matus Cimerman; 28.04.2016
comment
Я получаю attributeerror: 'str' не имеет атрибута 'map'. Однако я могу запустить v = datetime.strptime ('13AUG15: 09: 40: 15', '% d% b% y:% H:% M:% S'). Strftime ('% w'), который возвращает значение 4. Спасибо за ваше время! - person user6200992; 28.04.2016

приведенный ниже подход сработал для меня, используя однострочный udf - похожий, но отличный от приведенного выше:

from  pyspark.sql  import SparkSession, functions
spark = SparkSession.builder.appName('dayofweek').getOrCreate()

настроить фреймворк:

df = spark.createDataFrame(
    [(1, "2018-05-12")
     ,(2, "2018-05-13")
     ,(3, "2018-05-14")
      ,(4, "2018-05-15")
      ,(5, "2018-05-16")
      ,(6, "2018-05-17")
      ,(7, "2018-05-18")
      ,(8, "2018-05-19")
      ,(9, "2018-05-20")
    ], ("id", "date")) 

настроить udf:

from pyspark.sql.functions import udf,desc
from datetime import datetime

weekDay =  udf(lambda x: datetime.strptime(x, '%Y-%m-%d').strftime('%w'))

df = df.withColumn('weekDay', weekDay(df['date'])).sort(desc("date"))

Результаты:

    df.show()

+---+----------+-------+
| id|      date|weekDay|
+---+----------+-------+
|  9|2018-05-20|      0|
|  8|2018-05-19|      6|
|  7|2018-05-18|      5|
|  6|2018-05-17|      4|
|  5|2018-05-16|      3|
|  4|2018-05-15|      2|
|  3|2018-05-14|      1|
|  2|2018-05-13|      0|
|  1|2018-05-12|      6|
+---+----------+-------+
person Grant Shannon    schedule 14.05.2018