在spark Scala中创建UDF,以便在spark DATAFRAME和SQL中的单个列而不是三个不同的列中获取特定格式

在spark Scala中创建UDF,以便在spark DATAFRAME和SQL中的单个列而不是三个不同的列中获取特定格式,scala,apache-spark,hadoop,bigdata,Scala,Apache Spark,Hadoop,Bigdata,我希望“经验”列数据在单个列中,如下面的一个雇用日期,此处不打印。下面不显示的是该列,但我希望在我的数据中显示该列: emp_id | emp_name | salary | Experience --------+----------+---------+------------------------- 68319 | KAYLING | 6000.00 | 26 years 2 mons 12 days 67858 | SCARLET | 3100.00 | 2

我希望“经验”列数据在单个列中,如下面的一个雇用日期,此处不打印。下面不显示的是该列,但我希望在我的数据中显示该列:

 emp_id | emp_name | salary  |       Experience
--------+----------+---------+-------------------------
  68319 | KAYLING  | 6000.00 | 26 years 2 mons 12 days
  67858 | SCARLET  | 3100.00 | 20 years 9 mons 11 days  
以下是我的查询结果:

sqlContext.sql("SELECT emp_id,emp_name,hire_date,salary,datediff(current_date(),hire_date) as (Experience) FROM employees WHERE (salary/30)>100").show()  
结果:

+------+--------+----------+------+----------+
|emp_id|emp_name| hire_date|salary|Experience|
+------+--------+----------+------+----------+
| 68319| KAYLING|1991-11-18|6000.0|      9763|
| 67858| SCARLET|1997-04-19|3100.0|      7784|  
模式:

|-- emp_id: long (nullable = true)
 |-- emp_name: string (nullable = true)
 |-- job_name: string (nullable = true)
 |-- manager_id: long (nullable = true)
 |-- hire_date: date (nullable = true)
 |-- salary: double (nullable = true)
 |-- commision: double (nullable = true)
 |-- dep_id: long (nullable = true)  
我尝试创建示例UDF,以获得Scala中的年度差异,但它一直给我错误。下面是我的错误代码:

def getYearValue(value:java.util.Date):String= {
val year1:String=year(current_date()-year(hire_date);
year1;
}
错误:

<console>:26: error: type mismatch;
 found   : org.apache.spark.sql.Column
 required: String
       val year1:String=year(current_date());  
那么,如何修改UDF代码以获得预期的格式呢?

这不是使用org.apache.spark.sql.functions的方式*

当前_日期返回列。 年取列和返回列。 此外,Spark使用java.sql.Date而不是java.util.Date。如果您想使用UDF UserDefinedFunction,您应该

val getYearValue = udf((value: java.sql.Date) => {
   val year1: String = java.time.LocalDate.now.getYear.toString
   year1
})
如果您想使用year和current_date函数,您应该对列进行操作


谢谢你的回复,但这对我来说有点复杂。你能提供我今年和提供的年份之间差异的UDF吗??如果我在执行代码时出错,那会很有帮助。例如,当我尝试执行您的UDF时,它给了我一个错误:object time不是包java val year1的成员:String=java.time.LocalDate.now.getYear.toStringI也修改了我的问题,以获得年份的差异。我尝试使用post,该post被称为解决了我的问题,但我仍然无法使用它得到精确解。使用它,我得到了如上所述的天数,每个数据都在一个单独的列中,而不是在一个单独的列中。我还没有解决这个问题的方法:我得到了这个问题的答案,但无法发布,因为人们已经将我的答案标记为重复答案
val ds: Dataset[Row] = ???

val current_year: Column = year(current_date())

ds.select(current_year)