我正在使用Spark SQL,并在Hive表上执行一些SQL操作。我的表是这样的:`
ID COST CODE
1 100 AB1
5 200 BC3
1 400 FD3
6 600 HJ2
1 900 432
3 800 DS2
2 500 JT4
我想创建另一个表格,这将是另一列中的总成本和前5个CODES。
ID TOTAL_COST CODE CODE_CHAIN
1 1400 432 432, FD3, AB1
总成本很简单,但是,如何从CODE列中连接值并形成另一列。
我已经尝试了collect_set函数但是,值不能被限制,也没有正确排序,可能是由于分布式处理。
任何SQL逻辑都可以吗?
编辑:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
使用slice,sort_array和collect_list
import org.apache.spark.sql.functions._
df
.groupBy("id")
.agg(
sum("cost") as "total_cost",
slice(sort_array(collect_list(struct($"cost", $"code")), false), 1, 5)("code") as "codes")
在Spark 2.3中,您必须使用已slice排序数组的手动索引替换
val sorted = sort_array(collect_list(struct($"cost", $"code")), false)("code")
val codes = array((0 until 5).map(i => sorted.getItem(i)): _*) as "codes"