【问题标题】:Calling groupBy method from dataset object through java interop using clojure使用clojure通过java互操作从数据集对象调用groupBy方法
【发布时间】:2019-07-03 01:57:49
【问题描述】:

我需要通过 clojure 的 java 互操作在 spark dataset 上调用 groupBy 方法。

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

这不起作用。 . .

(-> a-dataset

(.groupBy "a-column")

这样做。 . .

(-> b-dataset

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

我收到的错误信息是no groupBy method for dataset

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

【问题讨论】:

  • 感谢您的回复! - 我最终将调用包装在一个 clojure 函数中,该函数将数据集包含在参数中。使用它,我可以在每次调用 spark api 元素时使用数据集名称作为参数。

标签: java apache-spark clojure interop


【解决方案1】:

我对 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[] 作为参数一样。

那么问题来了,如何从DataSet 中获取Column?看来您可以致电dataset.col(String colName) 来获取它。把所有东西放在一起:

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

同样,我不知道如何验证这一点,但我认为这应该会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2023-03-21
    • 2013-08-28
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多