Scala中对DataFrame指定列应用map转换并保留其余列的方案咨询
实现方案
最优方案(单/少量列修改)
直接用Spark原生的withColumn方法即可,该方法的作用就是新增列或替换已有列,其余列会自动保留,一行代码即可完成需求:
import org.apache.spark.sql.functions.col val result = ABC.withColumn("B", col("B") * 2)
该方法不需要遍历全表所有列,代码可读性和执行效率都更高。
多指定列批量修改方案
如果需要同时修改多个指定列,可以用foldLeft迭代调用withColumn实现:
import org.apache.spark.sql.functions.col // 要修改的列列表 val colsToTransform = Array("B") val result = colsToTransform.foldLeft(ABC) { (df, colName) => df.withColumn(colName, col(colName) * 2) }
当需要修改的列数量远小于DataFrame总列数时,该方案比遍历所有列判断的写法性能更优。
select方法的正确写法
你之前报错的核心原因是select方法的参数类型不统一:要么全部传字符串列名,要么全部传Column类型对象,不能混传。如果要通过select实现需求,统一用Column类型参数即可:
import org.apache.spark.sql.functions.col val result = ABC.select(col("A"), (col("B") * 2).alias("B"))
内容的提问来源于stack exchange,提问作者kiarraa95
相关产品推荐
相关产品推荐

