Как фильтровать по списку диапазонов дат в Spark SQL с помощью Scala - PullRequest
0 голосов
/ 07 декабря 2018

Предположим, у нас есть фрейм данных с именем df со столбцом с именем "DATE".Я знаю, что мы можем отфильтровать фрейм данных по диапазону дат с помощью df.filter(col("DATE").between(startDate, endDate)) или по нескольким диапазонам дат с помощью df.filter(col("DATE").between(startDate, endDate) || col("DATE").between(startDate1, endDate1) || ...).

Но что если у нас есть список диапазонов дат, таких как [[startDate1, endDate1], [startDate2, endDate2], ..., [startDaten, endDaten]], число n может быть любымчисло.Существует ли эффективный способ фильтрации кадра данных по всем этим диапазонам дат?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Я нашел одно решение с картой и уменьшением.

Пусть диапазоны дат будут val dateRanges: List[(String, String)] = List((startDate1, endDate1), (startDate2, endDate2), (startDate3, endDate3))

val results = df.filter( dateRanges.map(range => col("Date").between(range._1, range._2)) .reduce((df1, df2) => df1 || df2))

Здесь сначала сопоставляется каждый диапазон датк разделу кадра данных, использующему map, различные разделы данных объединяются вместе с помощью reduce.

Но кто-нибудь знает эффективность этого метода?Конечно, объединение двух частей набора данных не будет оптимальным способом.

0 голосов
/ 07 декабря 2018

Я думаю, вы можете сделать это следующим образом:

val ranges = initilaze your ranges
val singleFilter = ranges.reduce { (d1, d2) => 
  col("DATE").between(d1.startDate, d1.endDate) || 
  col("DATE").between(d2.startDate, d2.endDate)
}
dataframe.filter(singleFilter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...