Unpivot in spark-sql/Scala 列名是数字

Unpivot in spark-sql/Scala column names are numbers

我已经为 Scala 尝试了此 post 中描述的内置堆栈函数,并且对于用包含字母但不在这些列中的代码标识的每个列都可以正常工作其中代码只是一个数字。

我有一个数据框 df 看起来像 this

我按照链接答案中的说明进行了申请:

val result = df.select($"Id", expr("stack(3, '00C', 00C, '0R5', 0R5, '234', 234)"))

结果is this one

我想要的是第 234 行的值为 0 as it should be。

因为 234 是数字 & 在 SQL 中,如果你 select 任何数字它将 return 与值相同的数字,你需要告诉编译器 234 是列名而不是数字,为此你必须在数字周围使用反引号 (`),即 `234`.

检查下面的代码。

scala> val df = Seq(("xyz",0,1,0)).toDF("Id","00C","0R5","234")
df: org.apache.spark.sql.DataFrame = [Id: string, 00C: int ... 2 more fields]

scala> df.select($"Id", expr("stack(3, '00C', 00C, '0R5', 0R5, '234',`234`)")).show(false)
+---+----+----+
|Id |col0|col1|
+---+----+----+
|xyz|00C |0   |
|xyz|0R5 |1   |
|xyz|234 |0   |
+---+----+----+