如何从Java Spark中的collect_list创建的列中获取第一个和最后一个元素

时间:2018-02-08 06:20:45

标签: java apache-spark

如果我理解正确的话 使用groupBy().agg(collect_list(column))将获得一列列表。 如何从该列表中获取第一个和最后一个元素以创建新列(在Spark Dataset Java中)?

首先,我可以做这样的事情

.withColumn("firstItem", functions.col("list").getItem(0))

但如何处理空列表?

对于最后一项,我在考虑size()-1,但在Java中,Spark数据集不支持-1,我试过:

withColumn("lastItem", function.col("list").getItem(functions.size(functions.col("list")).minus(1))

但它会投诉一些不支持的类型错误。

2 个答案:

答案 0 :(得分:1)

回答您的问题

  

但如何处理空列表?

不要担心。访问非现有索引会给出NULL(未定义),因此这里没有问题。

如果您想要某个默认值,请org.apache.spark.sql.functions.coalesce使用org.apache.spark.sql.functions.lit

  

对于最后一项,我考虑的是size() - 1,但在Java中,不支持-1

使用apply,而不是getItem

import static org.apache.spark.sql.functions.*;

col("list").apply(size(col("list")).minus(lit(1)));

在实践中

只需使用minmax个功能即可。 SQL中的Don't replicate groupByKey

相关

How to select the first row of each group?

答案 1 :(得分:0)

一个空列表将仅返回null而不出现任何错误。对最后一项执行此操作。

import org.apache.spark.sql.functions._
withColumn("lastItem", reverse(col("list")).getItem(0))