【问题标题】:How to pass Scala DataSet to Java Class in Apache Flink如何将 Scala 数据集传递给 Apache Flink 中的 Java 类
【发布时间】:2016-02-29 17:14:49
【问题描述】:

我是 Scala 的新手。所以我想用Java处理Apache Flink的DataSet。但是我在 Scala 代码中有一个 DataSet,我想传入 Java 类的方法。 例如: 在 Scala 中:

val dS: DataSet[Vector] = ...
SampleJavaClass.sendDS(ds)

在 SampleJavaClass.java 中有一个类似sendDs(DataSet<Vector> javaDs)的方法

我正在尝试这样做,但显示错误消息: 类型不匹配;发现:

org.apache.flink.api.scala.DataSet[org.apache.flink.ml.math.Vector] 必需:org.apache.flink.api.java.ExecutionEnvironment 错误 发生在涉及默认参数的应用程序中。

我该如何解决这个问题。请帮我解决这个问题。

【问题讨论】:

    标签: java scala apache-flink


    【解决方案1】:

    Scala DataSet 确实是 Java DataSet 的包装器。但是,由于方法 javaSet 是包私有的,因此您无法访问它。因此,目前只有一种非常简单的方法可以将 Scala DataSet 转换为 Java DataSet

    为了访问javaSet 方法,您必须将您的包定义为org.apache.flink 的子包。诚然,这不是最佳做法。

    如果这是一项严格要求的功能,您应该为此提交JIRA ticket

    【讨论】:

    • 我有一个 scala 文件包:(包 org.apache.flink.quickstart)。我需要为 java 文件创建(包 org.apache.flink.quickstart.java)吗?那么我可以将 scala DS 发送到 Java DS 吗?
    • 调用javaSet 的文件必须在org.apache.flink 包中。因此,您可以为自己编写一个辅助函数,该函数位于 org.apache.flink 包中,并简单地为给定的 DataSet 调用 javaSet 方法。
    • 但是没有功能,就不行。为什么?这里有什么技巧。可以的话请解释一下吗?
    • 如果没有功能它不起作用是什么意思?问题是DataSet.javaSet 方法被声明为private[flink],这意味着它只能被位于org.apache.flink 或子包中的代码访问。通常您应该定义自己的包名以避免名称冲突,但这是访问javaSet 函数的唯一方法。
    【解决方案2】:

    Flink中有两个DataSet类一个java one https://ci.apache.org/projects/flink/flink-docs-master/api/java/index.html?org/apache/flink/api/scala/DataSet.htmlscala one。您可以通过 javaSet() 从底层 scala 数据集中访问 java 。

    我会努力的

    SampleJavaClass.sendDS(ds.javaSet())
    

    这可能会安抚您的代码。

    【讨论】:

    • 我已经尝试过这种方法。但它显示了我提到的上述错误。 (在涉及默认参数的应用程序中发生错误。)这是什么意思?
    猜你喜欢
    • 2011-04-25
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    相关资源
    最近更新 更多