如果我理解正确的话
使用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))
但它会投诉一些不支持的类型错误。
答案 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)));
在实践中:
只需使用min
,max
个功能即可。 SQL中的Don't replicate groupByKey
。
相关强>:
答案 1 :(得分:0)
一个空列表将仅返回null
而不出现任何错误。对最后一项执行此操作。
import org.apache.spark.sql.functions._
withColumn("lastItem", reverse(col("list")).getItem(0))