我正在尝试将函数应用于我的一个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"。 我没有收到此代码的任何编译问题。我无法找到我的代码问题
答案 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|
+--------+------------+
希望这有帮助。最诚挚的问候