首页 > 解决方案 > 在 Spark Scala 中创建 UDF 以获得单列中的特定格式,而不是 SPARK DATAFRAME AND SQL 中的三个不同列

问题描述

我想要Experience像下面这样的单列中的“”列数据(hire_date这里没有打印。它是下面没有显示的列,但我想在我的数据中显示它):

 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 中获得差异,year但它一直给我错误。以下是我的错误代码:

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 代码以获得预期的格式呢?

标签: scalaapache-sparkhadoopbigdata

解决方案


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

  • current_date返回Column
  • year接受Column并返回Column

此外,Sparkjava.sql.Date不使用java.util.date. 如果你想使用 UDF ( UserDefinedFunction) 你应该

val getYearValue = udf((value: java.sql.Date) => {
   val year1: String = java.time.LocalDate.now.getYear.toString
   year1
})

如果你想使用yearcurrent_date功能,你应该在Columns.

val ds: Dataset[Row] = ???

val current_year: Column = year(current_date())

ds.select(current_year)

推荐阅读