从Spark数据集中选择某些列和特定列的最大值

时间:2018-02-22 19:56:47

标签: java apache-spark dataset apache-spark-sql

当我给dataset.show();时,我有一个JAVA spark数据集 给出了OutPut。

Col1    col2    rowNum

obj1    item1    1
obj1    item2    2
obj1    item3    3
obj2    item1    4
obj2    item3    5
obj3    item4    6

在同一个数据集中,我希望得到低于输出,

Col1    max(rownum)

obj1    3
obj2    5
obj3    6

我对JAVA spark完全不熟悉,任何人都可以帮助我从同一个数据集获得上述输出,并返回 6 6 在上述情况下。

2 个答案:

答案 0 :(得分:1)

以下代码将提供所需的输出:

SparkSession s=SparkSession.builder().appName("Stack Overflow Example test").master("local[*]").getOrCreate();
DataFrameReader read=s.read();
Dataset<Row> resp=read.option("header","true").csv("D://test.csv");
Dataset<Row> withColumn = resp.withColumn("rowNum", resp.col("rowNum").cast("long"));
Dataset<Row> orderBy = withColumn.orderBy(resp.col("Col1"));
orderBy.groupBy(resp.col("Col1")).max("rowNum").show();

<强>输出:

+----+-----------+
|Col1|max(rowNum)|
+----+-----------+
|obj1|          3|
|obj2|          5|
|obj3|          6|
+----+-----------+

我已经习惯了标题信息,以确保我们获得架构。

这里需要对rowNum列进行转换为Integer或Long。 可以在此之后执行排序,然后执行分组以获得最大值。

答案 1 :(得分:0)

这是一个非常简单的用例,所以我可以给你一些提示。尝试使用DataSet Java文档: https://spark.apache.org/docs/2.2.0/api/java/index.html?org/apache/spark/sql/Dataset.html

您希望使用groupBy功能按Col1对行进行分组。您将返回RelationalGroupedDataset:https://spark.apache.org/docs/2.2.0/api/java/index.html?org/apache/spark/sql/RelationalGroupedDataset.html

您可以使用max函数根据您选择的列进行聚合。如果您对此有疑问,请告诉我。