假设我们有一个名为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
的数目可以是任何数字。是否有一种有效的方法来按所有这些日期范围过滤数据框?
答案 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
将数据框的不同分区连接在一起。
但是有人知道这种方法的效率吗?当然,保持联接两个数据集不是最佳方法。