<p>使用<code>stack</code>Spark函数将数据拆分为行
<a href="https://spark.apache.org/docs/latest/api/sql/index.html#stack" rel="nofollow noreferrer">https://spark.apache.org/docs/latest/api/sql/index.html#stack</a></p>
<pre>
val df = Seq(
("FF", 20, "TT", 70, "HH", 88),
("DD", 22, "JJ", 66, "DD", 99),
).toDF("2019","C1","2018","C2","2017","C3")
df.createOrReplaceTempView("df")
df.show
val df1 = spark.sql("SELECT 2019 as year2019, `2019`, `C1`, 2018 as year2018, `2018`, `C2`, 2017 as year2017, `2017`, `C3` from df")
df1.createOrReplaceTempView("df1")
df1.show
spark.sql("SELECT stack(3, `2019`, `C1`, year2019, `2018`, `C2`, year2018, `2017`, `C3`, year2017) as (`COL1`, `C`, `Year`) from df1").show
// Exiting paste mode, now interpreting.
+ + -+ + -+ + -+
|2019| C1|2018| C2|2017| C3|
+ + -+ + -+ + -+
| FF| 20| TT| 70| HH| 88|
| DD| 22| JJ| 66| DD| 99|
+ + -+ + -+ + -+
+ + + -+ + + -+ + + -+
|year2019|2019| C1|year2018|2018| C2|year2017|2017| C3|
+ + + -+ + + -+ + + -+
| 2019| FF| 20| 2018| TT| 70| 2017| HH| 88|
| 2019| DD| 22| 2018| JJ| 66| 2017| DD| 99|
+ + + -+ + + -+ + + -+
+ + -+ +
|COL1| C|Year|
+ + -+ +
| FF| 20|2019|
| TT| 70|2018|
| HH| 88|2017|
| DD| 22|2019|
| JJ| 66|2018|
| DD| 99|2017|
+ + -+ +
</pre>