преобразовать столбец в нижний регистр, используя withColumn в спарк не работает - PullRequest
0 голосов
/ 19 апреля 2020

Я новичок в спарк, у меня есть код ниже, чтобы преобразовать данный столбец в нижний регистр и обновить данный кадр данных. Я нашел эту логику c на net, которая не работает для меня.

Данные: test.csv

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,rock
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,rock
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,rock

Я хочу преобразовать значения hashID первого столбца в нижний регистр "aaaaaaaaaaaaaaaaa" для этого у меня есть этот код ниже

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)
}
}

1 Ответ

1 голос
/ 19 апреля 2020

Это просто потому, что вы не присваиваете результат ни одному 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)
...