scala - 我想使用三列进行计算并生成显示所有三个值的单列
问题描述
我在 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
我能够找到解决方案。
解决方案
每个列名可以用值连接,然后所有值可以连接在一列中,用逗号分隔:
// 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 提出的解决方案类似,但看起来更明确。
推荐阅读
- java - Spark Java数据集按范围分类行
- java - Thymeleaf bean validation for entity in List field
- r - 将函数应用于 data.table 或 data.frame 中的多对列的最优雅的方法是什么?
- javascript - 在制表符中显示总值而不是总百分比
- syntax - 匹配方括号中的字符串的语法(如`[a string]`)?
- apache-nifi - 无法解析 csv 中的双精度值
- mysql - 使用条件选项将 csv 文件导入到 sql 工作台
- java - 无法在我的 Android 应用程序中实施短信验证
- python - Python 循环代码不会与求解器代码一起打印,可能有问题吗?
- python - Python/Spyder - 从自定义包导入时类类型的友好名称