Я пытаюсь отфильтровать DataFrame, сравнивая два столбца даты, используя Scala и Spark. На основе отфильтрованного DataFrame сверху выполняются вычисления для вычисления новых столбцов.
Упрощенный мой фрейм данных имеет следующую схему:
|-- received_day: date (nullable = true)
|-- finished: int (nullable = true)
Кроме того, я создаю два новых столбца t_start
и t_end
, которые будут использоваться для фильтрации DataFrame. Они имеют разницу в 10 и 20 дней от исходного столбца received_day
:
val dfWithDates= df
.withColumn("t_end",date_sub(col("received_day"),10))
.withColumn("t_start",date_sub(col("received_day"),20))
Теперь я хочу иметь новый вычисляемый столбец, который указывает для каждой строки данных, сколько строк в кадре данных в периоде от t_start
до t_end
. Я думал, что смогу добиться этого следующим образом:
val dfWithCount = dfWithDates
.withColumn("cnt", lit(
dfWithDates.filter(
$"received_day".lt(col("t_end"))
&& $"received_day".gt(col("t_start"))).count()))
Однако этот счет возвращает только 0, и я считаю, что проблема заключается в аргументе, который я передаю lt
и gt
.
Из этой проблемы здесь Фильтрация кадра данных искры по дате Я понял, что мне нужно передать строковое значение. Если я пытаюсь использовать жестко закодированные значения, такие как lt(lit("2018-12-15"))
, то фильтрация работает. Поэтому я попытался привести мои столбцы к StringType
:
val dfWithDates= df
.withColumn("t_end",date_sub(col("received_day"),10).cast(DataTypes.StringType))
.withColumn("t_start",date_sub(col("received_day"),20).cast(DataTypes.StringType))
Но фильтр все еще возвращает пустой dataFrame.
Я бы предположил, что я не правильно обрабатываю тип данных.
Я работаю на Scala 2.11.0 с Spark 2.0.2.