2016-09-29 6 views
0

Ich habe eine CSV-Datei. Es hat viele Spalten, von denen zwei Monat und Jahr sind. Monat wird als 1 ... 12 dargestellt, während Jahr 2013 .. (Beispiel). Ich muss einen Zeitstempel im Format MM/JJJJ als neue Spalte erstellen, z. B. "Zeitstempel". Ich habe das folgende Snippet ausprobiert, aber es ist fehlgeschlagen.Mit der Unix-Zeitstempel-Methode beim Erstellen von Zeitstempel in Spark

scala> val df = spark.read.format("csv").option("header",  
"true").load("/user/bala/*.csv") 
df: org.apache.spark.sql.DataFrame = [_c0: string, Month: string ... 28  
more fields] 

scala> val df = spark.read.format("csv").option("header", 
"true").load("/user/bala/AWI/*.csv") 
df: org.apache.spark.sql.DataFrame = [_c0: string, Month: string ... 28 
more fields] 

scala> import org.apache.spark.sql.functions.udf 
import org.apache.spark.sql.functions.udf 

scala> def makeDT(Month: String, Year: String) = s"$Month $Year" 
makeDT: (Month: String, Year: String)String 

scala> val makeDt = udf(makeDT(_:String,_:String)) 
makeDt: org.apache.spark.sql.expressions.UserDefinedFunction =  
UserDefinedFunction(<function2>,StringType,Some(List(StringType, 
StringType))) 

scala> df.select($"Month", $"Year", unix_timestamp(makeDt($"Month", 
$"Year"), "mm/yyyy")).show(2) 
    +-----+----+-----------------------------------------+ 
    |Month|Year|unix_timestamp(UDF(Month, Year), mm/yyyy)| 
    +-----+----+-----------------------------------------+ 
    | 1|2013|          null| 
    | 1|2013|          null| 
    +-----+----+-----------------------------------------+ 
    only showing top 2 rows 
scala> 

Kann mir jemand zeigen, wo ich falsch liege ??

Antwort

1

Sie benötigen Tag, Monat & Jahr Zeitstempel zu bauen. Sie können Ihre makeMT neu definieren:

scala>def makeMT(Month: String, Year: String) = s"00/$Month/$Year 00:00:00" 

Dann können Sie es unter ähnlichen verwenden (ich nicht testen):

(unix_timestamp(makeDt($"Month", $"Year"), "dd/M/yyyy HH:mm:ss") * 1000).cast("timestamp") 
Verwandte Themen