簡體   English   中英

如何使用Scala在Spark SQL中按日期范圍列表進行過濾

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM