需要使用 scala 删除 Spark 数据帧列名称中的字符串"_value"



让我的数据框架如下所示。这里我必须删除字符串"_value"从我的dataframe的所有列名。

import spark.implicits._
import org.apache.spark.sql.functions._
val simpledata = Seq(("file1","name1","101"),
("file1","name1","101"),
("file1","name1","101"),
("file1","name1","101"),
("file1","name1","101"))
val df = simpledata.toDF("filename_value","name_value_value","serialNo_value")
df.show()

输出菜单在这里输入图像描述如果我使用replaceAll:val renamedColumnsDf = df.columns.map(c => df(c).as(c.replaceAll('_value',"")))它删除所有的_values,但我只需要删除基于最后出现的字符串。

需要帮助来删除基于列名中出现的字符串。

我的输出应该是:

+--------------+----------------+--------------+
|filename      |name_value      |serialNo      |
+--------------+----------------+--------------+
|         file1|           name1|           101|
|         file1|           name1|           101|
|         file1|           name1|           101|
|         file1|           name1|           101|
|         file1|           name1|           101|
+--------------+----------------+--------------+

如果希望仅在_value子字符串是列名的后缀时删除该子字符串,则可以执行以下操作:

val simpleDf: DataFrame = simpledata.toDF("filename_value", "name_value_value", "serialNo_value")
val suffix: String = "_value"
val renamedDf: DataFrame = simpleDf.columns.foldLeft(simpleDf) { (df, c) =>
if (c.endsWith(suffix)) df.withColumnRenamed(c, c.substring(0, c.length - suffix.length)) else df}
renamedDf.show()

输出将是:

+--------+----------+--------+
|filename|name_value|serialNo|
+--------+----------+--------+
|   file1|     name1|     101|
|   file1|     name1|     101|
|   file1|     name1|     101|
|   file1|     name1|     101|
|   file1|     name1|     101|
+--------+----------+--------+

为什么要这么复杂的编码?您可以在映射转换中的列名上使用模式匹配:

val newName = columnName match {
case s"${something}_value" => something
case other => other
}

相关内容

  • 没有找到相关文章

最新更新