scala 前向参考扩展了值数据帧的定义

Posted

技术标签:

【中文标题】scala 前向参考扩展了值数据帧的定义【英文标题】:scala forward reference extends over definition of value dataframe 【发布时间】:2018-11-11 10:07:55 【问题描述】:

我正在尝试对数据框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
  
);

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于scala 前向参考扩展了值数据帧的定义的主要内容,如果未能解决你的问题,请参考以下文章

将一个数据帧的数组列与scala中另一个数据帧的数组列的子集进行比较

在 Apache Spark (Scala) 上获取两个数据帧的差异

根据来自其他数据帧的位置条件在数据帧上编写选择查询,scala

获取一行数据帧的字段值 - Spark Scala

Scala中的Spark分组映射UDF

Spark 中的数据框比较:Scala