Spark SQL java添加具有不同行计数的列
对SQL和Spark非常陌生,我正在尝试在数据集上添加一列,其中包含count distinct。 数据集: 预期结果: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
| 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();