Фильтрация данных между двумя раза в pyspark - PullRequest
0 голосов
/ 25 августа 2018

У меня есть датафрейм, импортированный из CSV с двумя столбцами (среди прочих): дата и время.Date - это строка даты в формате YYYY-MM-DD, а Time - строка в формате HH:MM.При импорте этого в pyspark с inferSchema «Дата» автоматически выводится на дату и время, что разрешает их все до полуночи (например, 2018-05-04 00:00:00.000).

Мне нужно отфильтровать данные только к тем данным, где времямежду двумя часами (9 утра и 5 вечера).Самая основная идея, которую я имел, состояла в том, чтобы фильтровать только по строке, например,

return dataframe.filter( dataframe.Time.like("19%") )

В качестве альтернативы я подумал о агрегировании даты и времени в один столбец «Метка времени», например, как показано ниже.(вероятно, очень плохо, я все еще изучаю pyspark):

data = data.withColumn( "Timestamp", to_utc_timestamp(concat(date_format(col("Date"), "YYYY-MM-dd "), col("Time")), "GMT") # )

В принципе, как я могу это сделать, поскольку я не в восторге ни от одного из этих методов?Если второй метод выглядит разумным, как можно применить фильтр?Недостатком второго метода является то, что он оставляет фрейм данных с новым столбцом, что является потенциально непредвиденным побочным эффектом (я пытаюсь построить этот код достаточно модульно).

Заранее спасибо.Извиняюсь за неопределенность вопроса, я все еще изучаю pyspark и пытаюсь узнать о различных возможных способах достижения цели.

1 Ответ

0 голосов
/ 25 августа 2018

При импорте этого в pyspark с помощью inferSchema автоматически выводится «Дата» для datetime, которая разрешает их все до полуночи (например, 2018-05-04 00: 00: 00.000)

для этого вы должны использовать date_format(col('Date'), 'yyyy-MM-dd'), который извлечет дату из даты и времени и преобразует столбец в StringType

И теперь, когда и дата, и время являются StringType, вы можете использовать concat_ws(' ', date_format(col('Date'), 'yyyy-MM-dd'), col('Time')) для объединения даты и времени

Теперь, когда дата и время объединены, вы можете использовать to_timestamp(concat_ws(' ', date_format(col('Date'), 'yyyy-MM-dd'), col('Time')), 'yyyy-MM-dd HH:mm') для преобразования StringType dateTime в отметку времени

и использовать функцию часа для извлечения часа и, наконец, использовать фильтр для фильтрации кадра данных

таким образом, рабочий код будет иметь вид

from pyspark.sql.functions import *
df = df.withColumn('hourOfDay', hour(to_timestamp(concat_ws(' ', date_format(col('Date'), 'yyyy-MM-dd'), col('Time')), 'yyyy-MM-dd HH:mm')))\
        .filter((col('hourOfDay') >= lit(9)) & (col('hourOfDay') <= lit(17)))\
        .drop('hourOfDay')

, который должен дать отфильтрованный желаемый результат

Надеюсь, ответ полезен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...