无法将功能应用于Spark Dataframe Column

时间:2017-05-18 17:42:36

标签: scala apache-spark dataframe udf

我正在尝试将函数应用于我的一个dataframe列来转换值。该列中的值类似于" 20160907"我需要的价值是" 2016-09-07"。

我写了一个这样的函数:

def convertDate(inDate:String ): String = {
   val year = inDate.substring(0,4)
   val month = inDate.substring(4,6)
   val day = inDate.substring(6,8)

   return year+'-'+month+'-'+day
}

在我的spark scala代码中,我正在使用它:

def final_Val {
  val oneDF = hiveContext.read.orc("/tmp/new_file.txt")
  val convertToDate_udf = udf(convertToDate _)
  val convertedDf = oneDF.withColumn("modifiedDate", convertToDate_udf(col("EXP_DATE")))
  convertedDf.show()
}

令人惊讶的是,在火花壳中,我能够毫无错误地运行。在scala IDE中,我收到以下编译错误:

Multiple markers at this line:
not enough arguments for method udf: (implicit evidence$2: 
reflect.runtime.universe.TypeTag[String], implicit evidence$3: reflect.runtime.universe.TypeTag[String])org.apache.spark.sql.UserDefinedFunction. Unspecified value parameters evidence$2, evidence$3.

我正在使用Spark 1.6.2,Scala 2.10.5

有人可以告诉我这里我做错了什么吗?

我试过不同功能的相同代码,如本文所示:stackoverflow.com/questions/35227568/applying-function-to-spark-dataframe-column"。 我没有收到此代码的任何编译问题。我无法找到我的代码问题

1 个答案:

答案 0 :(得分:3)

根据我在火花峰会课程中学到的知识,你必须尽可能使用sql.functions方法。在实施您自己的udf之前,您必须检查执行相同工作的sql.functions包中是否存在function。使用现有函数 spark 可以为您做很多优化,并且没有义务将数据序列化和反序列化到JVM对象中。

达到你想要的结果我会提出这个解决方案:

val oneDF = spark.sparkContext.parallelize(Seq("19931001", "19931001")).toDF("EXP_DATE")
val convertedDF = oneDF.withColumn("modifiedDate", from_unixtime(unix_timestamp($"EXP_DATE", "yyyyMMdd"), "yyyy-MM-dd"))
convertedDF.show()

这给出了以下结果:

+--------+------------+
|EXP_DATE|modifiedDate|
+--------+------------+
|19931001|  1993-10-01|
|19931001|  1993-10-01|
+--------+------------+

希望这有帮助。最诚挚的问候