首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spark DataFrame:将144列转换为行

Spark DataFrame:将144列转换为行
EN

Stack Overflow用户
提问于 2021-07-17 04:01:11
回答 2查看 47关注 0票数 1

环境: Spark 2.4.0;Scala

我已经从CSV创建了具有144列的DF。有没有办法把除了一列之外的所有列都改成行?

代码语言:javascript
复制
Table A 
|dt  |AA|BB|CC|     
|----|--|--|--|
|1012|10|12|13|        
|1013|13|14|15|
|1014|14|18|30|


Table B (After transform Table A) 

|dt  |Head|Val|
|----|----|---
|1012|AA  |12|
|1013|AA  |13|
|1014|AA  |14|
|1012|BB  |12|
|1013|BB  |14|
|1014|BB  |18|
|1012|CC  |13|
|1013|CC  |15|
|1014|CC  |30|

我需要将/ UnPivot表A转置到表B。请注意,表A有144列。我认为内置函数栈(n,expr1,...,exprk),但我不知道如何自动传递这么多列。

感谢您的时间和努力来帮助我们。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-18 00:52:21

您可以使用Scala字符串操作动态创建stack的参数列表:

代码语言:javascript
复制
val dfA = Seq((1012, 10, 12, 13), (1013, 13, 14, 15), (1014, 14, 18, 30)).toDF("dt", "AA", "BB", "CC")

val columns = dfA.columns.filter(!_.equalsIgnoreCase("dt"))
var cmd = s"stack(${columns.length},"
for( col <- columns) cmd += s"'$col',$col,"
cmd = cmd.dropRight(1) + ")"

val dfB = dfA.selectExpr("dt", cmd)
  .withColumnRenamed("col0", "Head")
  .withColumnRenamed("col1", "Val")

结果:

代码语言:javascript
复制
+----+----+---+
|  dt|Head|Val|
+----+----+---+
|1012|  AA| 10|
|1012|  BB| 12|
|1012|  CC| 13|
|1013|  AA| 13|
|1013|  BB| 14|
|1013|  CC| 15|
|1014|  AA| 14|
|1014|  BB| 18|
|1014|  CC| 30|
+----+----+---+
票数 1
EN

Stack Overflow用户

发布于 2021-07-17 16:17:50

这个问题的答案是如何自动处理DF中的所有列。

代码语言:javascript
复制
val columnsToConcat: Array[String] = df.schema.fieldNames.filter(_ == "yourSingleColToExclude")
df.select("yourSingleColToExclude", concat_ws("separator", columnsToConcat.map(col):_*))

但是我不知道,关于stack函数的限制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68414682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档