Scala前向引用扩展了值数据帧的定义

时间:2018-11-11 10:07:56

标签: scala apache-spark apache-spark-sql

我正在尝试基于XML文件对类型为所有列的数据框df_trial中的列进行类型转换。

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

1 个答案:

答案 0 :(得分:0)

在if-else的每个分支中,在定义它们之前,都使用称为df_trial的值。您需要重新排列代码以首先定义它们。

注意:您使用它的方式没有使用最顶部的df_trial。根据您要尝试执行的操作,可能需要将第一个df_trial更改为var,并从其他用法中删除val。 (这可能仍然是错误的,因为在循环columnList时,您将多次覆盖相同的变量)。