scala.collection.Seq在Java中无法使用

3

使用:

  • Apache Spark 2.0.1
  • Java 7

在Apache Spark Java API文档中,DataSet类出现了一个示例,使用scala.collection.Seq参数指定列名来使用join方法。但是我无法使用它。 文档中提供了以下示例:

df1.join(df2, Seq("user_id", "user_name"))

错误: 找不到符号方法 Seq(String)

我的代码:

import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import scala.collection.Seq;

public class UserProfiles {

public static void calcTopShopLookup() {
    Dataset<Row> udp = Spark.getDataFrameFromMySQL("my_schema","table_1");

    Dataset<Row> result = Spark.getSparkSession().table("table_2").join(udp,Seq("col_1","col_2"));
}

请参见https://dev59.com/s2kw5IYBdhLWcg3wNXz2。 - Alexey Romanov
1个回答

4

Seq(x, y, ...)是Scala创建序列的方法。Seq有其伴生对象,该对象具有apply方法,允许每次不必写new

可以这样写:

import scala.collection.JavaConversions;
import scala.collection.Seq;

import static java.util.Arrays.asList;

Dataset<Row> result = Spark.getSparkSession().table("table_2").join(udp, JavaConversions.asScalaBuffer(asList("col_1","col_2")));`

或者您可以创建自己的小方法:

 public static <T> Seq<T> asSeq(T... values) {
        return JavaConversions.asScalaBuffer(asList(values));
    }

@TzachZohar 是的,我的错,我忘记了使用伴生对象并不那么容易 ;) 请查看编辑 - T. Gawęda
值得注意的是,它只在导入scala.collection.immutable.Seq时有效,而不是mutablescala.collection.Seq - Łukasz
@TzachZohar 你使用的是哪个版本的Scala?在我的版本2.11中,我无法执行new Seq("vaue"),因为Seq是抽象的 - 包括scala.collection.Seq和不可变版本。 - T. Gawęda
@T.Gawęda非常感谢!!!您的第一个建议有效,来自TzachZohar的第二个建议不起作用,或者至少不那么容易,因为Seq类是抽象的,我不想实现所有这些方法。 - José Carlos Guevara Turruelles
感谢@Łukasz的帮助和贡献,他在我编辑时给出了他的答案(第一个版本不好,他帮助我找到了一个遗漏的部分)。非常感谢:) - T. Gawęda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接