sparksql/scala中的unpivot列名是数字

4szc88ey  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(588)

我在sparksql/pyspark for scala中尝试了本文unpivot中描述的内置堆栈函数,对于用包含字母的代码标识的每一列都可以很好地工作,但对于那些代码只是一个数字的列则不行。
我有一个像这样的Dataframe
我申请了链接答案中提到的:

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

结果就是这个
我想要的是,第234行的值应该是0。

s71maibg

s71maibg1#

因为234是数字&在sql中,如果您选择任何数字,它将返回与值相同的数字,您需要告诉编译器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   |
+---+----+----+

相关问题