重新格式化 scala 代码和 if/ else 语句



我已经编写了Scala代码和Spark数据帧。 起初,它正在工作(仅当我不使用 if else 语句时(。虽然它不是一个干净的代码,想知道我该如何转换它?

其次,if/else 语句不起作用,如何将 python 中的值附加到上面的变量中,并在以后将其用作数据帧?

对不起,我是 Scala 的新手。

%scala
for(n <- Scalaconfigs){
var bulkCopyMetadata = new BulkCopyMetadata
val sourceTable = n(0)
val targetTable  = n(1) 
println(sourceTable)
println(targetTable)
val df = spark.sql(s"SELECT * FROM ${sourceTable}")

if (sourceTable == "est.Values"){
val vs1 = df.withColumn("Duration", 'Duration.cast("double")).withColumn("StartUTC", 'StartTimeUTC.cast("bigint")).select('DeviceID, 'DeviceType, 'StartUTC, 'Duration as 'Duration)
}
else if  (sourceTable == "est.tests"){
val vs1 = df.withColumn("DateUTC", 'DateUTC.cast("Timestamp")).select('ID, 'DateUTC as 'DateUTC)
}
val writeConfig = Config(Map(
"url"               -> url,
"databaseName"      -> databaseName,
"dbTable"           -> targetTable,
"user"              -> user, 
"password"          -> password,
"connectTimeout"    -> "5",
"bulkCopyBatchSize" -> "100000",
"bulkCopyTableLock" -> "true",
"bulkCopyTimeout"   -> "600"
))
vs1.bulkCopyToSqlDB(writeConfig)
//vs1 doesnot take value, when i use if else statements

}

找不到变量"vs1"。那个错误。我知道这是因为变量 vs1 是在 if else 块中定义的,但我如何在上面使用它。我试过把它放在上面,但我不确定数据类型。

vs1在本地范围内,在外部不可见。在外部声明vs1,并尝试使用模式匹配而不是if else

val vs1 = sourceTable match {
case "est.Values" =>
df.withColumn("Duration", 'Duration.cast("double"))
.withColumn("StartUTC", 'StartTimeUTC.cast("bigint"))
.select('DeviceID, 'DeviceType, 'StartUTC, 'Duration as 'Duration)
case "est.tests" =>
df.withColumn("DateUTC", 'DateUTC.cast("Timestamp"))
.select('ID, 'DateUTC as 'DateUTC)
}

最新更新