1

`错误:类型不匹配。必需:(sql.DataFrame, String) => sql.DataFrame,找到:(sql.DataFrame, String) => Any

我正在尝试遍历数据框中的所有列。所以我使用了foldLeft。需要根据以下情况替换数据:例如:如果列类型是Integer,则执行一个操作,如果列类型是另一种类型,则需要执行另一个操作..但是获取类型如果我在 foldLeft 中使用条件,则会出现不匹配错误。请有人帮忙。

val actualDF = nonullDF
    .columns
    .foldLeft(nonullDF) { (memoDF, colName) =>
      if (memoDF.schema("colName").dataType == IntegerType) {
        memoDF.withColumn(
          colName,
          when(col("colName") === "?",
            (memoDF.select(avg("colName")).head().getInt(0)))
            .otherwise(col("colName")))
      }
      else if (memoDF.schema("colName").dataType == DoubleType) {
        memoDF.withColumn(
          colName,
          when(col("colName") === "?",
            (memoDF.select(avg("colName")).head().getDouble(0)))
            .otherwise(col("colName")))
      }
      else if (memoDF.schema("colName").dataType == StringType) {
        memoDF.withColumn(
          colName,
          when(col("colName") === "?", memoDF.groupBy(col("colName")).count().orderBy(desc("count")).first()(0))
            .otherwise(col("colName")))
      }
    }```
4

1 回答 1

1

那是因为你错过了一个 else 块。

您可以使用模式匹配重写代码,如下所示:

  nonullDF.columns
    .foldLeft(nonullDF) { (memoDF, colName) =>
      memoDF.schema(colName).dataType match {
        case _: StringType => // transformation goes here
        case _: IntegerType =>
        case _: DoubleType => 
        case _ => memoDF 
      }
    }
于 2021-08-05T13:05:15.853 回答