环境: Spark 2.4.0;Scala
我已经从CSV创建了具有144列的DF。有没有办法把除了一列之外的所有列都改成行?
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),但我不知道如何自动传递这么多列。
感谢您的时间和努力来帮助我们。
【玩转 GPU】有奖征文
精美礼品等你拿!
您可以使用Scala字符串操作动态创建 stack 的参数列表:
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")
结果:
+----+----+---+ | dt|Head|Val| +----+----+---+ |1012| AA| 10| |1012| BB| 12| |1012| CC| 13| |1013| AA| 13|