在spark scala中创建udf,以便在spark dataframe和sql中的单个列而不是三个不同的列中获取特定格式

jslywgbw  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(355)

这个问题在这里已经有答案了

如何在sparksql中获得两个日期之间的月、年差(4个答案)
两年前关门了。
我想要' 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)

我尝试创建示例自定义项,以获得 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());

那么,如何修改我的自定义项代码以获得预期的格式呢?

tzdcorbm

tzdcorbm1#

你不是这样用的
org.apache.spark.sql.functions.* current_date 退货 Column . yearColumn 返回 Column .
此外,spark使用 java.sql.Date 不是 java.util.date . 如果你想使用自定义项( UserDefinedFunction )你应该

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

如果你想用 year 以及 current_date 应操作的功能 Columns .

val ds: Dataset[Row] = ???

val current_year: Column = year(current_date())

ds.select(current_year)

相关问题