2016-12-19 64 views
1

对不起,如果这似乎是一个愚蠢的问题。我需要为别人的Spark应用程序编写一个非常简单的字符串处理函数,但是我对Spark有限/没有经验。我被告知我可以用Java编写它并发送jar文件。编写一个Java JAR的火花

我对设计的外观有点困惑吗?如果我只是创建一个包含方法的标准类(没有任何Spark特定的代码),它会起作用吗?在导入jar之后,这将如何从(Scala)Spark应用程序初始化/调用?

+0

您可以编写自定义Java函数并将其注册为Spark UDF。或者你可以编写一个在Spark DataFrame或DataSet上做一些处理的函数。如果您可以使用现有的Spark DataFrame函数而不使用UDF,那么这可能是首选的方法。 – clay

回答

0

不需要添加任何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问题。

+0

谢谢,这正是我一直在寻找的! –

+0

有什么办法可以在Spark中使用对象,而不是使用静态方法来避免做一些冗余的事情? –

+0

您可以在Scala中使用任何Java结构,只需随意写出Java代码,并且Spark Dev将能够使用它。只是要注意收集的东西,你需要允许转换 –