gpt4 book ai didi

java - 互操作 : sharing Datasets of objects or Row between Java and Scala, 两种方式。我将 Scala 数据集操作放在 Java 的中间

转载 作者:行者123 更新时间:2023-12-04 15:17:37 25 4
gpt4 key购买 nike

目前,我的主要应用程序是使用 Java Spring-boot 构建的,这不会改变,因为它很方便。
@Autowired服务 bean 实现,例如:

  • Enterpriseestablishment 数据集。第一个还能够返回具有 MapEnterprise 对象列表。他们的机构。
    所以服务返回:Dataset<Enterprise> , Dataset<Establishment> , Dataset<Row>
  • 协会:Dataset<Row>
  • 城市:Dataset<Commune>Dataset<Row> ,
  • 地方当局:Datatset<Row> .

许多用户案例函数都是这种调用:

What are associations(year=2020) ?

我的申请转发到datasetAssociation(2020)与企业和机构数据集以及城市和地方当局的数据集一起运作,以提供有用的结果。

许多人推荐我从 Scala 能力中受益

为此,我正在考虑涉及数据集之间其他操作的操作:

  • 一些由 Row 制成,
  • 一些携带具体物体。

根据达到/涉及的数据集,我有这个操作要做:
协会。enterprises.establishments.cities.localautorities

我可以在 Scala 中写出粗体部分吗?这意味着:

  1. A Dataset<Row>使用 Java 构建的代码被发送到 Scala 函数以完成。

  2. Scala 使用 Enterprise 创建一个新数据集和 Establishment对象。
    a) 如果对象的源代码是用 Scala 编写的,我不必在 Java 中为它重新创建一个新的源代码。
    b) 相反,如果对象的源代码是用 Java 编写的,我就不必在 Scala 中重新创建一个新的源代码。
    c) 我可以在 Java 端直接使用此数据集返回的 Scala 对象。

  3. Scala 将必须调用在 Java 中实现的函数,并将其正在创建的基础数据集发送给它们(例如用城市信息完成它们)。

Java 随时调用 Scala 方法
Scala 也随时调用 Java 方法:

一个操作可以跟随一个
Java -> Scala -> Scala -> Java -> Scala -> Java -> Java
路径(如果需要),以调用方法的本地语言表示。
因为我事先不知道哪些部分对移植到 Scala 有用。

完成这三点后,我将认为 JavaScala 能够以两种方式互操作并从另一种方式中受益。

但我可以实现这个目标吗(在 Spark 2.4.x 或更可能在 Spark 3.0.0 中)?

总结一下,Java 和 Scala 是否可以通过两种方式互操作,一种方式:

  • 它不会使源代码在一方面或另一方面过于笨拙。或者最糟糕的是:重复。
  • 它不会显着降低性能(例如,必须重新创建整个数据集或转换它包含的每个对象,无论是一侧还是另一侧,都是令人望而却步的)。

最佳答案

正如 Jasper-M 所写,scala 和 java 代码可以完美地互操作:

  • 它们都编译成 .class 文件,由 jvm 以相同的方式执行
  • spark java 和 scala API 一起工作,有几个细节:
    • 两者使用相同的 Dataset 类,所以没有问题
    • 但是 SparkContext 和 RDD(以及所有 RDD 变体)具有在 java 中不实用的 scala api。主要是因为 scala 方法将 scala 类型作为输入,而不是您在 java 中使用的类型。但是它们都有 java 包装器(JavaSparkContext、JavaRDD)。在 Java 中编码,您可能已经见过那些包装器。

现在,正如很多人所推荐的那样,spark首先是一个scala库,scala语言比java(*)更强大,用scala写spark代码会容易很多。此外,您会在 scala 中找到更多的代码示例。通常很难找到用于复杂数据集操作的 Java 代码示例。

因此,我认为您应该注意的两个主要问题是:

  1. (与 spark 无关,但有必要)有一个编译这两种语言并允许双向互操作性的项目。我认为 sbt 提供了开箱即用的功能,对于 maven,您需要使用 scala 插件,并且(根据我的经验)将 java 和 scala 文件都放在 java 文件夹中。否则一个可以调用另一个,反之不行(scala调用java但java不能调用scala,反之亦然)
  2. 您应该注意每次创建类型化数据集时使用的编码器(即 Dataset[YourClass] 而不是 Dataset<Row> )。在 Java 中,对于 Java 模型类,您需要使用 Encoders.bean(YourClass.class)明确地。但在 scala 中,默认情况下 spark 会隐式找到编码器,并且编码器是为 scala 案例类(“产品类型”)和 scala 标准集合构建的。所以请注意使用了哪些编码器。例如,如果您在 Scala 中创建 YourJavaClass 的数据集,我认为您可能必须明确给出 Encoders.bean(YourJavaClass.class)让它工作并且没有序列化问题。

最后一点:您写道您使用 java Spring-boot。所以

  • 请注意,Spring 设计完全违背了 scala/functional 推荐的做法。到处使用 null 和可变的东西。你仍然可以使用 Spring,但它在 scala 中可能会很奇怪,社区可能不会轻易接受它。
  • 您可以从 spring 上下文调用 spark 代码,但不应使用 spark 中的 spring(上下文),尤其是在 spark 分发的方法内部,例如 rdd.map .这将尝试在每个 worker 中创建 Spring 上下文,这非常慢并且很容易失败。

(*) 关于“scala 比 java 更强大”:我并不是说 scala 比 java 好(好吧,我确实这么认为,但这是一个品味问题:)。我的意思是 scala 语言比 java 提供了更多的表现力。基本上它用更少的代码做更多的事情。主要区别是:

  • 隐式,被 spark api 大量使用
  • monad + for-comprehension
  • 当然还有强大的类型系统(阅读协变类型,例如,List[Dog] 在 scala 中是 List[Animal] 的子类,但在 java 中不是)

关于java - 互操作 : sharing Datasets of objects or Row between Java and Scala, 两种方式。我将 Scala 数据集操作放在 Java 的中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64016506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com