开发者社区> 问答> 正文

我想使用三列计算并生成单列,并显示所有三个值

我在spark databrick中加载数据框中的文件

spark.sql("""select A,X,Y,Z from fruits""")

A X Y Z
1E5 1.000 0.000 0.000
1U2 2.000 5.000 0.000
5G6 3.000 0.000 10.000
我需要输出为

A      D  

1E5 X 1
1U2 X 2, Y 5
5G6 X 3, Z 10

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

    每个列名都可以与值连接,然后所有值都可以在一列中连接,用逗号分隔:

    // data
    val df = Seq(
    ("1E5", 1.000, 0.000, 0.000),
    ("1U2", 2.000, 5.000, 0.000),
    ("5G6", 3.000, 0.000, 10.000))
    .toDF("A", "X", "Y", "Z")

    // action
    val columnsToConcat = List("X", "Y", "Z")
    val columnNameValueList = columnsToConcat.map(c =>
    when(col(c) =!= 0, concat(lit(c), lit(" "), col(c).cast(IntegerType)))

    .otherwise("")

    )
    val valuesJoinedByComaColumn = columnNameValueList.reduce((a, b) =>
    when(org.apache.spark.sql.functions.length(a) =!= 0 && org.apache.spark.sql.functions.length(b) =!= 0, concat(a, lit(", "), b))

    .otherwise(concat(a, b))

    )
    val result = df.withColumn("D", valuesJoinedByComaColumn)
    .drop(columnsToConcat: _*)
    输出:

    A D
    1E5 X 1
    1U2 X 2, Y 5
    5G6 X 3, Z 10

    解决方案类似于stack0114106提出的,但看起来更明确。

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

相关电子书

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