2015-11-26 108 views
3

我試圖使用數據磚過濾下列數據的日期範圍,數據磚以響應返回null。 我的CSV數據是這樣的:如何在Spark SQL中按日期範圍進行過濾

ID, Desc, Week_Ending_Date 
100, AAA, 13-06-2015 
101, BBB, 11-07-2015 
102, CCC, 15-08-2015 
103, DDD, 05-09-2015 
100, AAA, 29-08-2015 
100, AAA, 22-08-2015 

我的查詢是:

df.select(df("ID"), date_format(df("Week_Ending_Date"), "yyyy-MM-dd")) 
.filter(date_format(df("Week_Ending_Date"), "yyyy-MM- dd").between("2015-07-05", "2015-09-02")) 

任何幫助深表感謝。

回答

7

從我的頭頂,我會通過轉換日期列做了以下在閱讀它,然後使用別名應用濾鏡:

import java.text.SimpleDateFormat 

val format = new SimpleDateFormat("dd-MM-yyyy") 
val data = sc.parallelize(
    List((100, "AAA", "13-06-2015"), (101, "BBB", "11-07-2015"), (102, "CCC", "15-08-2015"), (103, "DDD", "05-09-2015"), (100, "AAA", "29-08-2015"), (100, "AAA", "22-08-2015")).toSeq).map { 
    r => 
    val date: java.sql.Date = new java.sql.Date(format.parse(r._3).getTime); 
    (r._1, r._2, date) 
}.toDF("ID", "Desc", "Week_Ending_Date") 

data.show 

//+---+----+----------------+ 
//| ID|Desc|Week_Ending_Date| 
//+---+----+----------------+ 
//|100| AAA|  2015-06-13| 
//|101| BBB|  2015-07-11| 
//|102| CCC|  2015-08-15| 
//|103| DDD|  2015-09-05| 
//|100| AAA|  2015-08-29| 
//|100| AAA|  2015-08-22| 
//+---+----+----------------+ 

val filteredData = data.select(data("ID"), date_format(data("Week_Ending_Date"), "yyyy-MM-dd").alias("date")).filter($"date".between("2015-07-05", "2015-09-02")) 

//+---+----------+ 
//| ID|  date| 
//+---+----------+ 
//|101|2015-07-11| 
//|102|2015-08-15| 
//|100|2015-08-29| 
//|100|2015-08-22| 
//+---+----------+ 
+0

它的工作原理,謝謝,你能不能給我用DataFrame而不是'parallelize'? – Sivailango

+0

@Sivailango我不明白你的意思是DataFrame而不是並行化?數據值是一個DataFrame。 – eliasah

+0

代替在列表並行化值,已經我已經設置在數據幀的那些樣值的'VAR DF = sqlContext.read.format(「com.databricks.spark.csv」) \t \t \t \t \t。選項(」頭」, 「真」) \t \t \t \t \t。選項( 「則InferSchema」, 「真」) \t \t \t \t \t .load( 「test.csv」);'這是我的數據幀,我已裝載數據由https://github.com/databricks/spark-csv插件 – Sivailango