使用clojure

时间:2019-07-03 01:57:49

标签: java apache-spark clojure interop

我需要通过Clojure通过Java互操作在groupBy上调用spark dataset方法。

我只需要为一列调用此名称,但是我可以使用的唯一groupBy签名涉及多个列名称。该api似乎表明我应该只能使用一个列名,但是我无法使用它。我真正需要的是一个很好的例子。我想念什么?

这不起作用。 。

(-> a-dataset

(.groupBy "a-column")

这样做。 。

(-> b-dataset

(.groupBy "b-column", (into-array ["c-column"])

我收到的错误消息说有no groupBy method for dataset

我知道它正在寻找一列,但我不知道如何给它一个。

1 个答案:

答案 0 :(得分:0)

我对Spark一无所知,但认为我们可以通过从Spark API documentation到Clojure的示例来更好地理解它:

   // To create Dataset<Row> using SparkSession
   Dataset<Row> people = spark.read().parquet("...");
   Dataset<Row> department = spark.read().parquet("...");

   people.filter(people.col("age").gt(30))
     .join(department, people.col("deptId").equalTo(department.col("id")))
     .groupBy(department.col("name"), people.col("gender"))
     .agg(avg(people.col("salary")), max(people.col("age")));

我们可以假设您已经有一个DataSet,并且想在其上调用.groupBy。您可能调用的方法是the one that takes Column... as an argument。您在Java中的 variadic 参数方法中将参数收集为数组的方式是正确的,所以就像接收Column[]作为参数一样。

问题是,如何从数据集中获取Column?看来您可以致电dataset.col(String colName)来获取它。放在一起:

(.groupBy my-dataset (into-array Column [(.col my-dataset "a-column")]))

再次,我没有验证方法,但是我认为这应该有所帮助。