如何在 Apache Spark 中将 Scala UDF 转换为 Java 版本?

Posted

技术标签:

【中文标题】如何在 Apache Spark 中将 Scala UDF 转换为 Java 版本?【英文标题】:How to convert Scala UDF's to Java version in Apache Spark? 【发布时间】:2016-02-03 11:03:21 【问题描述】:

我在 scala 中写过这样的 apache spark udf:

val toLongDate = udf((t: String) => new SimpleDateFormat("dd/MM/yyyy HH:mm:ss aa").parse(t).getTime)

我想在java中这样写这个udf:

import static org.apache.spark.sql.functions.udf;

UserDefinedFunction toLongDate = udf(myFunction1, typeTag1, typeTage2);

我不知道如何将这些参数提供给org.apache.spark.sql.functions.udf 函数?

我已经编写了 myFunction1,但 IntelliJ Idea 向我显示了无法解析 composeandThen 函数的错误:

【问题讨论】:

【参考方案1】:

AFAIK,您无法以任何有意义的方式从 Java 中获取 TypeTag,它是由 Scala 编译器生成的。您必须编译一些生成TypeTags 的Scala 代码,在这种情况下,从那里调用udf 要容易得多。

对于Function1,答案是扩展AbstractFunction1

new AbstractFunction1<String, Long>() 
    @Override
    Long apply(String x)  ... 

【讨论】:

以上是关于如何在 Apache Spark 中将 Scala UDF 转换为 Java 版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Scala 中将 Spark DataFrames 一一添加到 Seq()

在 Apache Spark SQL 中将中值作为窗口函数 (UDAF) 移动

如何在 Spark Scala 中将 WrappedArray 转换为 List?

Scala - 如何在 Spark SQL 查询中将日期字符串转换为时间戳?

如何在 Spark 2 Scala 中将 Row 转换为 json

如何在 Spark Scala 的 UDF 中将列作为值传递以检查条件