首页 > 解决方案 > 将函数应用于数据框列 spark scala

问题描述

我有一个包含大量列(150)的大型数据集,我想在除第一列之外的所有列上应用一个函数(UDF),该列具有 id 字段。我能够动态应用该函数,但现在我需要将带有 id 的最终数据集提交回数据帧。火花作业将在集群模式下运行,这是我尝试过的。

val df = sc.parallelize(
  Seq(("id1", "B", "c","d"), ("id2", "e", "d","k"),("id3", "e", "m","n"))).toDF("id", "dat1", "dat2","dat3")
df.show

+---+----+----+----+
| id|dat1|dat2|dat3|
+---+----+----+----+
|id1|   B|   c|   d|
|id2|   e|   d|   k|
|id3|   e|   m|   n|
+---+----+----+----+

df.select(df.columns.slice(1,df.columns.size).map(c => upper(col(c)).alias(c)): _*).show

----+----+----+
|dat1|dat2|dat3|
+----+----+----+
|   B|   C|   D|
|   E|   D|   K|
|   E|   M|   N|
+----+----+----+

预期产出

-----+----+----+
id|dat1|dat2|dat3|
-+----+----+----+
|id1|   B|   C|   D|
|id2|   E|   D|   K|
|id3|   E|   M|   N|
-+----+----+----+

标签: apache-sparkapache-spark-sql

解决方案


只需将该id列添加到其他(转换后的)列:

df.select(
    col("id") +: df.columns.tail.map(c => upper(col(c)).alias(c)): _*
).show
+---+----+----+----+
| id|dat1|dat2|dat3|
+---+----+----+----+
|id1|   B|   C|   D|
|id2|   E|   D|   K|
|id3|   E|   M|   N|
+---+----+----+----+

推荐阅读