Spark Scala实现DataFrame城市列单词首字母大写并保留全列
解决方案
方法1:使用自定义UDF
通过自定义函数处理City列的字符串,再用withColumn替换原列,保留所有其他列:
import org.apache.spark.sql.functions.udf // 定义处理函数:拆分字符串后每个单词首字母大写再拼接 val capitalizeWords = udf((cityStr: String) => { cityStr.trim.split(" ").map(_.capitalize).mkString(" ") }) // 修改City列,其余列自动保留 val resultDf = df.withColumn("City", capitalizeWords(df("City"))) resultDf.show()
方法2:使用Spark内置函数(Spark 3.0+)
利用Spark原生函数组合实现,无需自定义UDF,性能更优:
import org.apache.spark.sql.functions.{trim, split, transform, initcap, concat_ws} val resultDf = df.withColumn( "City", concat_ws(" ", transform(split(trim($"City"), " "), word => initcap(word))) ) resultDf.show()
trim:去除City字符串首尾空格split:按空格拆分字符串为单词数组transform:对数组中每个单词应用initcap(首字母大写,其余小写)concat_ws:将处理后的单词数组重新拼接成字符串
原代码问题说明
你使用的map操作会把DataFrame的每一行(Row对象)转换为单个字符串,直接生成了仅含value列的新DataFrame,因此丢失了ID、Country等其他列。而withColumn是在原DataFrame基础上修改指定列,不会影响其他列的保留。
内容的提问来源于stack exchange,提问作者Sumi
相关产品推荐
相关产品推荐

