scala—为每行查找一组列中的第一个非空值和列名

zzzyeukh  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(305)

我有这样一个Dataframe:

col1     col2     col3     Other
====================================
NULL     1        2        A
3        4        5        B
NULL     NULL     NULL     C

我想用这个规则得到以下结果:
对于每一行,找到第一个非空值并在中设置其值 FirstValue 并将其列名设置为 ColName 如果行中的所有值都为空, FirstValue 以及 ColName 设置为空
保持 Other
预期结果:

FirstValue     ColName      Other
====================================
1             col2         A
3             col1         B
NULL          NULL         C
fiei3ece

fiei3ece1#

你可以用 coalesce :

val df2 = df.select(
    coalesce(df.columns.dropRight(1).map(col):_*).as("FirstValue"), 
    coalesce(df.columns.dropRight(1).map(c => when(col(c).isNotNull, lit(c))):_*).as("ColName"), 
    col("Other")
)

df2.show
+----------+-------+-----+
|FirstValue|ColName|Other|
+----------+-------+-----+
|         1|   col2|    A|
|         3|   col1|    B|
|      null|   null|    C|
+----------+-------+-----+

相关问题