scala spark shell:架构函数structtype不匹配

carvr3hs  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(382)

学习scala使用spark并在返回类型方面有困难:
代码:

def createSchema (name: String) : StructType = {
  if (name == "test01") {
    StructType(
      List(
        StructField("id", StringType, true),
        StructField("score", DoubleType, true)
  ))}
}

生产:

error: type mismatch;
 found   : Unit
 required: org.apache.spark.sql.types.StructType

如果没有参数和if条件,函数将按预期工作。
了解 if 条件是最后计算的表达式,并将返回类型设置为 Unit .
我试过了 val 定义(和其他变体)没有成功。
代码:

def createSchema (name: String) : StructType = {
  val struct: StructType = if (name == "test01") {
    StructType(
      List(
        StructField("id", StringType, true),
        StructField("score", DoubleType, true)
  ))}
  struct
}

生产:

error: type mismatch; 
found   : Unit
required: org.apache.spark.sql.types.StructType
var struct: StructType = if (name == "test01") {
                         ^

感谢您对理解类型不匹配错误和解决方案的帮助。
使用if(作为学习练习)测试函数的解决方案。
代码:

def createSchema (name: String) : StructType = {
  val struct = if (name == "test01") {
    StructType(
      List(
        StructField("id", StringType, true),
        StructField("score", DoubleType, true)
    ))
  }
  else {
    StructType(
      List(
        StructField("col1", StringType, true),
        StructField("col2", StringType, true)
    ))
  }
  struct
}

谢谢你的帮助和解释。

s5a0g9ez

s5a0g9ez1#

因为您没有定义else条件,所以它返回所有分支的最小公共超类型,即 Unit . 请记住,if条件也可能不是真的,这意味着方法的主体是空的(=unit)。
你可以通过输入

val struct = if (name == "test01") {
  StructType(
    List(
      StructField("id", StringType, true),
      StructField("score", DoubleType, true)
    )
  )
}

进入您的scala repl以查看是否重新运行:

struct: Any = ()

声明一个else条件,或者,在执行此操作时,删除if条件。

相关问题