如何使用Scala在Spark SQL中按日期范围列表进行过滤

时间:2018-12-07 19:20:51

标签: scala apache-spark dataframe

假设我们有一个名为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 :(得分:0)

我认为您可以这样:

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)

答案 1 :(得分:0)

我想出了一种使用map和reduce的解决方案。

让日期范围为 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将数据框的不同分区连接在一起。

但是有人知道这种方法的效率吗?当然,保持联接两个数据集不是最佳方法。