scala - 在火花中使用 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)
}
}
解决方案
这只是因为您没有将结果分配给任何 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)
推荐阅读
- opencart - 如何删除类别页面上的重复列?
- node.js - 获取包含特定文件 nodjs 的所有第一个子文件夹
- amazon-web-services - Gitlab:如何使用 S3 的自动缩放运行器处理大于 5GB 的缓存
- ios - NSUUID *真的*与.Net GUID相同吗?和安卓?
- shell - 控制台输出中某些关键字的发送邮件
- android - 索引超出范围:ArrayList
- graphql - 桑格利亚查询返回 IntType
- objective-c - iOS12:UIWebView 问题
- python-3.x - 在python中滑动矩阵
- python - 在 python/django 中创建对象列表的最佳方法输出