Spark SQL java添加具有不同行计数的列

Spark SQL java添加具有不同行计数的列,java,apache-spark-sql,Java,Apache Spark Sql,对SQL和Spark非常陌生,我正在尝试在数据集上添加一列,其中包含count distinct。 数据集: 预期结果: | col1 | col2 | uniques | | A | B | 3 | | C | D | 1 | 我的Java代码: return dataset.agg(countDistinct(col1,col2)); 但是没有影响这里不适用Distinct。Count distinct在计数之前删除每个组中的重复项,因此u

对SQL和Spark非常陌生,我正在尝试在数据集上添加一列,其中包含count distinct。 数据集:

预期结果:

| col1 | col2 | uniques |
|   A  |  B   |   3     |
|   C  |  D   |   1     |
我的Java代码:

return dataset.agg(countDistinct(col1,col2));

但是没有影响

这里不适用Distinct。Count distinct在计数之前删除每个组中的重复项,因此uniques列始终只包含一个

要获得所需的结果,需要执行基本的分组/聚合操作。以下是实现此目标的多种方法:

SparkSession spark = ...;

StructType schema = new StructType(new StructField[]{
    new StructField("col1", DataTypes.StringType, true, new MetadataBuilder().build()),
    new StructField("col2", DataTypes.StringType, true, new MetadataBuilder().build())
});

List<Row> rows = new ArrayList<>();
rows.add(RowFactory.create("A", "B"));
rows.add(RowFactory.create("C", "D"));
rows.add(RowFactory.create("A", "B"));
rows.add(RowFactory.create("A", "B"));

Dataset<Row> ds = spark.createDataFrame(rows, schema);
ds.createTempView("table");

// (1)
spark.sql("select col1, col2, count(*) as uniques from table group by col1, col2").show();

// (2)
ds.groupBy(ds.col("col1"), ds.col("col2")).count().show();

// (3)
ds.groupBy(ds.col("col1"), ds.col("col2"))
  .agg(functions.count(functions.lit(1)).alias("uniques") /*, functions.avg(...), functions.sum(...) */)
  .show();
第一个例子是所谓的Spark SQL

2和3的语法可能很难理解。我将尝试用非常基本的术语解释它们。groupBy将数据逻辑地分组到类似于Map的东西中。count为每个组应用counting聚合函数。该函数的结果是新列和丢弃列表。因此,在结果中,我们有一个由col1、col2组成的表,它们是自动添加的,因为它们是分组键和新的列唯一性


有时需要同时应用多个聚合函数。第三个例子解决了这个问题。您可以在agg中列出多个函数。每一个这样的函数都会产生一个新的列。

非常清楚,thx用于解决如何使用agg一次应用多个聚合函数!
SparkSession spark = ...;

StructType schema = new StructType(new StructField[]{
    new StructField("col1", DataTypes.StringType, true, new MetadataBuilder().build()),
    new StructField("col2", DataTypes.StringType, true, new MetadataBuilder().build())
});

List<Row> rows = new ArrayList<>();
rows.add(RowFactory.create("A", "B"));
rows.add(RowFactory.create("C", "D"));
rows.add(RowFactory.create("A", "B"));
rows.add(RowFactory.create("A", "B"));

Dataset<Row> ds = spark.createDataFrame(rows, schema);
ds.createTempView("table");

// (1)
spark.sql("select col1, col2, count(*) as uniques from table group by col1, col2").show();

// (2)
ds.groupBy(ds.col("col1"), ds.col("col2")).count().show();

// (3)
ds.groupBy(ds.col("col1"), ds.col("col2"))
  .agg(functions.count(functions.lit(1)).alias("uniques") /*, functions.avg(...), functions.sum(...) */)
  .show();