开发者社区> 问答> 正文

来自列的Concat值并创建另一列

我正在使用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逻辑都可以吗?

编辑:

展开
收起
社区小助手 2018-12-05 14:57:09 1739 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    使用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"

    2019-07-17 23:18:24
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载