Как я могу преобразовать часовой диапазон в общее количество часов, используя SQL? - PullRequest
0 голосов
/ 18 октября 2019

В настоящее время я работаю с набором данных Yelp, и моя цель состоит в том, чтобы определить общее количество часов, в течение которых бизнес открыт в неделю. Из данных я могу извлечь временной интервал для каждого дня, который выглядит как «9: 0-0: 0» или «17: 30-21: 30» для определенного дня. Как я могу использовать SQL для получения единственного значения для этих часовых диапазонов?

Это код, который я использовал, чтобы просто показать часы для бизнеса в наборе данных.

df_busSelected = df_business.select("business_id", "name"
                   , "hours.Sunday", "hours.Monday", "hours.Tuesday"
                   ,"hours.Wednesday", "hours.Thursday", "hours.Friday"
                   , "hours.Saturday")
df_busSelected.show()

Надеюсьсоздать новый столбец с общим количеством часов, в течение которых бизнес открыт в неделю с заданными диапазонами.

1 Ответ

1 голос
/ 18 октября 2019

Используя pyspark, вы можете сделать что-то вроде следующего:

from pyspark.sql.functions import expr

df.withColumn('h', expr('split(hours, "[-:]")').astype('array<int>')) \
  .withColumn('h1', expr('''
        h[2] - h[0] + IF(h[2]<h[0],24,0) + round((h[3]-h[1])/60,0)
   ''').astype('int')) \
  .show()
+----------+-----------+----------------+---+
|     bdate|      hours|               h| h1|
+----------+-----------+----------------+---+
|2019-10-17|    9:0-0:0|    [9, 0, 0, 0]| 15|
|2019-10-18|17:30-21:30|[17, 30, 21, 30]|  4|
+----------+-----------+----------------+---+

Сначала используйте набор символов [-:], чтобы разбить столбец hours на массив из 4 элементов (названный h) иприведите его к массиву int (первоначально массив StringType)

Затем выполните простую математическую процедуру и в конце приведите тип результата к int снова.

Далее используйте date_format('bdate', 'EEEE') чтобы получить название недели, а затем использовать groupby и pivot и, возможно, agg + sum функции, чтобы получить окончательный результат

...