使用unix_timestamp方法在spark中创建时间戳

时间:2016-09-29 11:23:11

标签: apache-spark spark-dataframe

我有一个csv文件。它有很多列,其中两列是月和年。月份表示为1 ... 12而2013年表示..(示例)。我需要创建一个格式为mm / yyyy的时间戳作为新列,比如'timestamp'。我尝试了下面的代码片段,但它失败了。

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 个答案:

答案 0 :(得分: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")