2016-09-29 178 views
0

我有一个csv文件。它有很多列,其中两个是Month和Year。月份表示为1 ... 12,而2013年(例如)。我需要创建一个格式为mm/yyyy的时间戳作为新列,比如'timestamp'。我尝试了下面的代码片段,但失败了。使用unix_timestamp方法在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> 

有人可以指出我在哪里我错了吗?

回答

1

你需要一天,月份&建立时间戳。 你可以重新定义你的makeMT:

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

然后你可以使用它类似下面(我没有测试它):

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