【发布时间】:2020-08-22 07:28:00
【问题描述】:
我正在 scala 中创建一个函数,我想在我的 spark-sql 查询中使用它。我的查询在 hive 中运行良好,或者如果我在 spark sql 中给出相同的查询,但我在多个使用相同的查询地方,所以我想将它创建为可重用的函数/方法,所以只要它需要我就可以调用它。 我在我的 scala 类中创建了以下函数。
def date_part(date_column:Column) = {
val m1: Column = month(to_date(from_unixtime(unix_timestamp(date_column, "dd-MM-yyyy")))) //give value as 01,02...etc
m1 match {
case 01 => concat(concat(year(to_date(from_unixtime(unix_timestamp(date_column, "dd-MM- yyyy"))))-1,'-'),substr(year(to_date(from_unixtime(unix_timestamp(date_column, "dd-MM-yyyy")))),3,4))
//etc..
case _ => "some other logic"
}
}
但它显示多个错误。
- 对于 01:
◾十进制整数文字可能没有前导零。 (八进制语法 已经过时了。)
◾类型不匹配;找到:需要 Int(0):org.apache.spark.sql.Column。
- 对于“-”:
类型不匹配;发现:需要 Char('-'): org.apache.spark.sql.Column.
- 对于“substr”:
未找到:值 substr.
另外,如果我创建的任何简单函数也使用类型作为列,我无法注册它,因为我在列格式中无法获得错误。对于所有原始数据类型(String,Long,Int )它工作正常。但在我的情况下,类型是列所以 我无法做到这一点。有人可以指导我该怎么做。到目前为止,我在 stack-overflow 上发现我需要将此函数与 df 一起使用,然后需要将此 df 转换为临时表。有人可以请指导我任何其他替代方式,以便我现有代码无需太多更改即可使用此功能。
【问题讨论】:
-
你能告诉我你想要的输入和输出的细节吗??
-
输入-->date_column--->即03-01-2019 首先我想获取月份部分并分配到 m1 即 01 ..如果月份 01 然后检查 case 语句并希望输出为 012019(mmyyyy) 等..@Srinivas
-
我在下面添加了答案,请检查并让我知道它是否不起作用..
标签: scala apache-spark hive apache-spark-sql