无法将函数应用于 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|
+--------+------------+
希望对您有所帮助。最好的问候
我正在尝试将函数应用于我的数据框列之一以转换值。列中的值类似于“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|
+--------+------------+
希望对您有所帮助。最好的问候