首页 > 解决方案 > 我想使用三列进行计算并生成显示所有三个值的单列

问题描述

我在 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

我能够找到解决方案。

标签: scalaapache-sparkapache-spark-sql

解决方案


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

// 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 提出的解决方案类似,但看起来更明确。


推荐阅读