对不起,如果这似乎是一个愚蠢的问题。我需要为别人的Spark应用程序编写一个非常简单的字符串处理函数,但是我对Spark有限/没有经验。我被告知我可以用Java编写它并发送jar文件。编写一个Java JAR的火花
我对设计的外观有点困惑吗?如果我只是创建一个包含方法的标准类(没有任何Spark特定的代码),它会起作用吗?在导入jar之后,这将如何从(Scala)Spark应用程序初始化/调用?
对不起,如果这似乎是一个愚蠢的问题。我需要为别人的Spark应用程序编写一个非常简单的字符串处理函数,但是我对Spark有限/没有经验。我被告知我可以用Java编写它并发送jar文件。编写一个Java JAR的火花
我对设计的外观有点困惑吗?如果我只是创建一个包含方法的标准类(没有任何Spark特定的代码),它会起作用吗?在导入jar之后,这将如何从(Scala)Spark应用程序初始化/调用?
不需要添加任何Spark细节(除非需要使用Spark类)。这里有一个例子:
[email protected]:~> cat MyClass.java
public class MyClass
{
public static int add(int x, int y)
{
return x + y;
}
}
[email protected]:~> javac MyClass.java
[email protected]:~> jar cvf MyJar.jar MyClass.class
added manifest
adding: MyClass.class(in = 244) (out= 192)(deflated 21%)
[email protected]:~> spark --jars ./MyJar.jar
Welcome to
____ __
/__/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.0.1
/_/
Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_111)
Type in expressions to have them evaluated.
Type :help for more information.
scala> MyClass.add(2,3)
res0: Int = 5
在这种情况下斯卡拉能够使用scala.Int
作为Java基本int
所以没有斯卡拉/ Java的互操作性方面的考虑。根据您的功能,您可能需要考虑这一点,但这是一个Scala-Java问题,而不是Spark问题。
谢谢,这正是我一直在寻找的! –
有什么办法可以在Spark中使用对象,而不是使用静态方法来避免做一些冗余的事情? –
您可以在Scala中使用任何Java结构,只需随意写出Java代码,并且Spark Dev将能够使用它。只是要注意收集的东西,你需要允许转换 –
您可以编写自定义Java函数并将其注册为Spark UDF。或者你可以编写一个在Spark DataFrame或DataSet上做一些处理的函数。如果您可以使用现有的Spark DataFrame函数而不使用UDF,那么这可能是首选的方法。 – clay