2017-08-29 31 views
0

我有一個簡單的模式已經得到了兩列3場的每列數據框:火花如何合併一個數據幀的列的兩個字段(字符串類型),生成日期

root 
|-- npaDetails: struct (nullable = true) 
| |-- additionalInformation: struct (nullable = true) 
| |-- npaStatus: struct (nullable = true) 
| |-- npaDetails: struct (nullable = true) 
|-- npaHeaderData: struct (nullable = true) 
| |-- npaNumber: string (nullable = true) 
| |-- npaDownloadDate: string (nullable = true)  
| |-- npaDownloadTime: string (nullable = true)  

可能的值:

npaDownloadDate - "30JAN17" 
npaDownloadTime - "19.50.00" 

我需要比較DataFrame中的兩行與此模式,以確定哪一個是「新鮮」。要做到這一點,我需要合併域npaDownloadDatenpaDownloadTime生成一個日期,我可以很容易地比較。

低於我迄今爲止編寫的代碼。它的工作原理,但我認爲它需要更多的步驟,我敢肯定,斯卡拉比我的方法提供更好的解決方案。

val parquetFileDF = sqlContext.read.parquet("MyParquet.parquet") 

val relevantRows = parquetFileDF.filter($"npaHeaderData.npaNumber" === "123456") 

val date = relevantRows .select($"npaHeaderData.npaDownloadDate").head().get(0) 
val time = relevantRows .select($"npaHeaderData.npaDownloadTime").head().get(0) 

val dateTime = new SimpleDateFormat("ddMMMyykk.mm.ss").(date+time) 

//I would replicate the previous steps to get dateTime2 
if(dateTime.before(dateTime2)) 
    println("dateTime is before dateTime2") 

所以"30JAN17""19.50.00"輸出將Mon Jan 30 19:50:00 GST 2017

有另一種方式來從一列的兩個字段一個日期,而無需提取並把它們合併爲字符串?甚至更好,是有可能直接在兩個不同行之間的兩個值(日期和時間)比較的數據幀知道哪一個有一個較舊日期

回答

1

我會使用

import org.apache.spark.sql.functions._ 

df.withColumn("some_name", date_format(unix_timestamp(
    concat($"npaHeaderData.npaDownloadDate", $"npaHeaderData.npaDownloadTime"), 
"ddMMMyykk.mm.ss").cast("timestamp"), 
"EEE MMM d HH:mm:ss z yyyy")) 
+0

這將輸出一個格式的日期Mon Jan 30 19:50:00 GST 2017? –

2

在2.2火花,

df.filter(
    to_date(
    concat(
     $"npaHeaderData.npaDownloadDate", 
     $"npaHeaderData.npaDownloadTime"), 
    fmt = "[your format here]") 
) < lit(some date)) 
+0

好的謝謝。我會嘗試 –

相關問題