[英]How to filter by a list of date ranges in Spark SQL with Scala
假設我們有一個名為df的數據框,其中有一列名為“ DATE”。 我知道我們可以使用df.filter(col("DATE").between(startDate, endDate))
按日期范圍過濾數據幀,或使用df.filter(col("DATE").between(startDate, endDate) || col("DATE").between(startDate1, endDate1) || ...)
按多個日期范圍過濾數據框df.filter(col("DATE").between(startDate, endDate) || col("DATE").between(startDate1, endDate1) || ...)
。
但是,如果我們有一個日期范圍列表,例如[[startDate1,endDate1],[startDate2,endDate2],...,[startDaten,endDaten]],那么n
的數量可以是任何數字。 是否有一種有效的方法來按所有這些日期范圍過濾數據框?
我認為您可以這樣操作:
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)
我想出了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
將數據框的不同分區連接在一起。
但是有人知道這種方法的效率嗎? 當然,保持聯接兩個數據集不是最佳方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.