2017-09-28 47 views
0

我希望能夠像在普通SQL中一樣過濾日期。那可能嗎?我遇到了如何將字符串從文本文件轉換爲日期的問題。如何在Scala中將字符串轉換爲日期,以便在SparkSQL中進行篩選?

import org.apache.spark._ 
import org.apache.spark.SparkContext._ 
import org.apache.spark.sql._ 
import org.apache.log4j._ 
import java.text._ 
//import java.util.Date 
import java.sql.Date 


object BayAreaBikeAnalysis { 

    case class Station(ID:Int, name:String, lat:Double, longitude:Double, dockCount:Int, city:String, installationDate:Date) 
    case class Status(station_id:Int, bikesAvailable:Int, docksAvailable:Int, time:String) 

    val dateFormat = new SimpleDateFormat("yyyy-MM-dd") 

    def extractStations(line: String): Station = { 
    val fields = line.split(",",-1) 
    val station:Station = Station(fields(0).toInt, fields(1), fields(2).toDouble, fields(3).toDouble, fields(4).toInt, fields(5), dateFormat.parse(fields(6))) 
    return station 
    } 

    def extractStatus(line: String): Status = { 
    val fields = line.split(",",-1) 
    val status:Status = Status(fields(0).toInt, fields(1).toInt, fields(2).toInt, fields(3)) 
    return status 
    } 

    def main(args: Array[String]) { 

    // Set the log level to only print errors 
    //Logger.getLogger("org").setLevel(Level.ERROR) 

    // Use new SparkSession interface in Spark 2.0  
    val spark = SparkSession 
    .builder 
    .appName("BayAreaBikeAnalysis") 
    .master("local[*]") 
    .config("spark.sql.warehouse.dir", "file:///C:/temp") 
    .getOrCreate() 

    //Load files into data sets 
    import spark.implicits._ 
    val stationLines = spark.sparkContext.textFile("Data/station.csv") 
    val stations = stationLines.map(extractStations).toDS().cache() 

    val statusLines = spark.sparkContext.textFile("Data/status.csv") 
    val statuses = statusLines.map(extractStatus).toDS().cache() 

    //people.select("name").show() 
    stations.select("installationDate").show() 

    spark.stop() 
    } 



} 

很明顯,字段(6).toDate()不能編譯,但我不確定要使用什麼。

+0

使用日期解析器將字符串解析爲日期。看看約達時間 – dumitru

回答

1

我認爲this post是你在找什麼。

here你會發現一個很好的字符串解析教程迄今。

希望這會有所幫助!

+0

它沒有。我遇到了許多問題,最值得注意的是Spark不喜歡java.util.Date。我用整個對象更新了我的問題。 –

+0

好的帖子沒有幫助,但教程做到了!謝謝! –

+0

不客氣!謝謝! –

1

以下是你可以在scala中將字符串轉換爲日期的方法。

(1)在java.util.date的情況下: -

val date= new SimpleDateFormat("yyyy-MM-dd") 
date.parse("2017-09-28") 

(2)在Joda的日期時間的情況下: -

DateTime.parse("09-28-2017") 
+0

當我試圖使用1時,它說SimpleDateFormat未找到。 IS java.util.date是否是正確的類? –

+0

不是。它是java.text –

+0

我遇到了許多問題,最值得注意的是Spark不喜歡java.util.Date。我用整個對象更新了我的問題。 –

1

這裏是一個幫助函數,它在代表日期並將其轉換爲時間戳的字符串

import java.sql.Timestamp 
import java.util.TimeZone 
import java.text.{DateFormat, SimpleDateFormat} 

def getTimeStamp(timeStr: String): Timestamp = { 

    val dateFormat: DateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") 
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")) 

    val date: Option[Timestamp] = { 
     try { 
     Some(new Timestamp(dateFormat.parse(timeStr).getTime)) 
     } catch { 
     case _: Exception => Some(Timestamp.valueOf("19700101'T'000000")) 
     } 
    } 

    date.getOrElse(Timestamp.valueOf(timeStr)) 
    } 

很明顯,您需要更改輸入日期表單從「yyyy-MM-dd'T'HH:mm:ss」轉換爲你有日期字符串的格式。

希望這會有所幫助。

相關問題