首页 > 解决方案 > 在火花中使用 withColumn 将列转换为小写不起作用

问题描述

我是新来的火花,我有下面的代码将给定的列转换为小写并更新给定的数据框。我在网上发现了这个对我不起作用的逻辑。

数据:test.csv

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,rock
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,rock
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,rock

为此,我想将第一列 hashID 值转换为小写“aaaaaaaaaaaaaaaa” 我有以下代码

import com.holdenkarau.spark.testing.{RDDComparisons, SharedSparkContext}
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.{col, lower}
import org.apache.spark.sql.types.{StringType, StructField, StructType}
import org.scalatest.{BeforeAndAfter, FunSuite}

 class Test extends FunSuite with SharedSparkContext with RDDComparisons with BeforeAndAfter 
 with Serializable {

 test(" test lowerCase") {

  val testSchema = StructType(
  Array(
    StructField("hashID", StringType, false),
    StructField("name", StringType, false)
  ))

val builder = SparkSession.builder()
builder.master("local[*]")

// Build spark session
val spark = builder
  .config("spark.driver.maxResultSize", "0")
  .appName("testData")
  .config("spark.driver.extraJavaOptions", "-Xss10M")
  .getOrCreate()

var DF = spark.read.format("csv").option("header", "false").schema(testSchema).load("~/test.csv")

println("before")
val colName="hashID"
DF.select(colName).take(2).foreach(println)
DF.withColumn(colName, lower(col(colName)))
println("after")
DF.select(colName).take(2).foreach(println)
}
}

标签: scalaapache-sparkapache-spark-sql

解决方案


这只是因为您没有将结果分配给任何 DF,并且由于您始终使用相同的变量 (DF),因此您始终打印原始值。

您只需要更改一行:

DF = DF.withColumn(colName, lower(col(colName)))

完整的代码将是:

println("before")
val colName="hashID"
DF.select(colName).take(2).foreach(println)
DF = DF.withColumn(colName, lower(col(colName)))
println("after")
DF.select(colName).take(2).foreach(println)

推荐阅读