scala 我该如何创建自定义函数,用于Spark Java的groupby.agg()和groupby.apply()?[已关闭]

bwntbbo3  于 2023-01-26  发布在  Scala
关注(0)|答案(1)|浏览(169)

我们不允许问题寻求有关书籍、工具、软件库等的推荐。你可以编辑问题,以便可以使用事实和引用来回答问题。
19小时前关门了。
Improve this question
有没有办法创建自定义函数来处理Spark Java数据集上使用的groupby.agg()和groupby.apply()?

Dataset<Row> df = // input;
df.groupby("something").agg(???)

// or

df.groupby("something").apply(???)

我浏览了一些Google搜索,我能找到的最接近的东西是,在使用grouby时,UDAF函数可能是创建某种自定义行为的好方法,但没有解释如何通过agg(). https://spark.apache.org/docs/3.0.2/api/java/org/apache/spark/sql/functions.htmlhttps://docs.databricks.com/udf/aggregate-scala.html使用UDAF

apply(Dataset<Row> df, scala.collection.Seq<org.apache.spark.sql.catalyst.expressions.Expression> groupingExprs, RelationalGroupedDataset.GroupType groupType)

apply函数的文档非常混乱,我不知道如何使用该函数:什么是scala. collection. seq,它是如何使用的?为什么我们需要指定另一个数据集和一个groupType。

qxgroojn

qxgroojn1#

注意:我对Spark还不够熟悉,无法回答您的最后一个“有什么办法吗”的问题,但总体上我对Scala相当熟悉,所以我的回答解决了您的一些困惑和其他问题。
该文档总体上看起来相当不错,但它似乎包括了Scala编译器生成的、不供您使用的内容,以及Scala代码使用的方法的Java化等效方法。

apply(
  Dataset<Row> df, 
  scala.collection.Seq<org.apache.spark.sql.catalyst.expressions.Expression> groupingExprs, 
  RelationalGroupedDataset.GroupType groupType
)

似乎是Scala源代码中的私有实现细节。
在Scala中,apply方法是一种特殊的语法糖,它使类/对象看起来像一个函数。(就像Java中的静态方法一样)充当构造函数,以便能够调用MyClass(arg1, arg2),而不必像new MyClass(arg1, arg2)那样使用new关键字。您找到的apply方法似乎是RelationalGroupedDataset的一个私有伪构造函数,不适合您使用。奇怪的是,它出现在文档中。
您询问了scala.collection.Seq--这是Scala的基“sequence”集合接口,类似于java.util.List,也是在使用“varargs”参数定义方法时在类型签名中使用的类型。
例如,看看the RelationalGroupedDataset scala docs,在agg方法重载中:

def agg(expr: Column, exprs: Column*): DataFrame

这一个显示为

Dataset<Row> agg(Column expr, scala.collection.Seq<Column> exprs)

由于编译varargs方法的方式,您可以使用

Dataset<Row> agg(Column expr, Column... exprs)

基本上是一样的,除了在字节码级别,exprsArray而不是scala.collection.Seq
尽管如此,我还是强烈推荐你学习Scala,它是一种比Java更好(我的主观看法)、更有表现力/更强大(客观事实)的语言/编译器,如果你打算使用Spark,它最终会让你的生活变得更轻松。

相关问题