无法将函数应用于 Spark Dataframe 列

Not able to apply function to Spark Dataframe Column

我正在尝试将函数应用于我的数据框列之一以转换值。列中的值类似于“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()
}

令人惊讶的是,在 spark shell 中我能够 运行 没有任何错误。在 scala IDE 中,我收到以下编译错误:

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

我正在使用 Spark 1.6.2、Scala 2.10.5

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

我用不同的函数尝试了相同的代码,例如 post:Whosebug。com/questions/35227568/applying-function-to-spark-dataframe-column”。 我没有遇到此代码的任何编译问题。我无法找出我的代码的问题

根据我在spark-summit课程中学到的,你必须尽可能使用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|
+--------+------------+

希望对您有所帮助。最好的问候