将参数传递给Scala udf

时间:2017-06-05 13:48:44

标签: scala apache-spark apache-spark-sql user-defined-functions

我在数据框的特定列上调用udf,在其中检查所有值是否按指定的日期格式有效。

sourcefile = sourcefile.withColumn(column, DateConversion(col(column)))

这里DateConversion是我的udf。我的问题是,有没有办法可以传递有效的日期格式" yyyy / MM / dd"作为此udf的字符串,可以在udf内部用于验证目的。

我在尝试

sourcefile = sourcefile.withColumn(column, DateConversion(col(column),"yyyy/MM/dd"))

但是这给出了错误。

2 个答案:

答案 0 :(得分:3)

在创建udf时,你可以只调用udf,传入日期格式 - 或者你想要的任何其他参数。

def getUdf(format: String) = udf{date: String =>
  /*some logic that uses format*/}

然后像这样调用该方法

val dateConversion = getUdf("yyyy/MM/dd")
sourcefile = sourcefile.withColumn(column, dateConversion(col(column)))

这也允许您通过更改传递给getUdf的参数来轻松换出日期转换格式,而不是在udf中硬编码格式时的难度

答案 1 :(得分:3)

您可以使用lit函数创建文字列并传递给udf。

def udfName = udf((name: String, value:String) => {
      name + value
    })

调用udf时使用lit()函数:

dataframe.withColumn("colName", udfName($"firstName", lit("xyz")))

希望这有帮助!