Я новичок в Spark API. Я пытаюсь извлечь номер дня недели из столбца, например col_date (с отметкой даты и времени, например, «13AUG15: 09: 40: 15»), которая является строкой, и добавить еще один столбец в качестве дня недели (целое число). Я не умею делать это успешно.
Извлечь номер дня недели из строкового столбца (отметка даты и времени) в Spark API
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
Я забыл важную часть, .strftime ('% w') делает волшебство и возвращает номер дня недели.
- person Matus Cimerman; 28.04.2016
Я получаю 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