scala - scala 前向参考扩展了值数据帧的定义
问题描述
我正在尝试根据我尝试对每列进行类型转换df_trial
的 XML 文件,对数据框中的列进行类型转换,该数据框中的所有列都为字符串。
val columnList = sXml \\ "COLUMNS" \ "COLUMN"
val df_trial = sqlContext.createDataFrame(rowRDD, schema_allString)
columnList.foreach(i => {
var columnName = (i \\ "@ID").text.toLowerCase()
var dataType = (i \\ "@DATA_TYPE").text.toLowerCase()
if (dataType == "number") {
print("number")
var DATA_PRECISION: Int = (i \\ "@DATA_PRECISION").text.toLowerCase().toInt
var DATA_SCALE: Int = (i \\ "@DATA_SCALE").text.toLowerCase().toInt;
var decimalvalue = "decimal(" + DATA_PRECISION + "," + DATA_SCALE + ")"
val df_intermediate: DataFrame =
df_trial.withColumn(s"$columnName",
col(s"$columnName").cast(s"$decimalvalue"))
val df_trial: DataFrame = df_intermediate
} else if (dataType == "varchar2") {
print("varchar")
var DATA_LENGTH = (i \\ "@DATA_LENGTH").text.toLowerCase().toInt;
var varcharvalue = "varchar(" + DATA_LENGTH + ")"
val df_intermediate =
df_trial.withColumn(s"$columnName",
col(s"$columnName").cast(s"$varcharvalue"))
val df_trial: DataFrame = df_intermediate
} else if (dataType == "timestamp") {
print("time")
val df_intermediate =
df_trial.withColumn(s"$columnName", col(s"$columnName").cast("timestamp"))
val df_trial: DataFrame = df_intermediate
}
});
解决方案
在 if-else 的每个分支中,您都在使用在df_trial
定义它们之前调用的值。您需要重新排列代码以首先定义它们。
注意:按照您的方式,df_trial
最顶部的 没有被使用。根据您要执行的操作,您可能希望将第一个更改df_trial
为 avar
并val
从其他用法中删除。(这可能仍然是错误的,因为您将在循环时多次覆盖同一个变量columnList
)。
推荐阅读
- mobile - 如何使用 tensorflow lite 实现情绪检测?
- javascript - CSS/JS 如果由于先前的元素从流中删除而移动图像的位置,我可以转换图像的位置吗?
- ruby - 定义类实例的默认访问器
- terraform - 重新初始化 terraform 后的 ResourceInUseException
- list - Pair 的 kotlin 列表进入 Pair.first 列表
- python - 如何在Python中快速计算一堆十进制数的模式?
- python - Python 脚本发送更多它应该发送的电子邮件
- bash - 根据目录的变量重定向日志
- php - 在 MySQL 中使用 UPDATE 语句的问题
- c++ - 包含在子项目中