代码之家  ›  专栏  ›  技术社区  ›  Ehud Lev

数据帧。rdd。count在将case类与List一起使用时,未找到适用于实际参数的构造函数/方法

  •  4
  • Ehud Lev  · 技术社区  · 8 年前

    我正在使用Spark 2.1.0,并在2.1.1上检查了此场景。 这对我来说很奇怪,似乎是一个序列化问题。 我正在使用包含scala列表的case类,遇到以下错误:

    Executor task launch worker for task 1] [CodeGenerator.logError]: failed to compile: org.codehaus.commons.compiler.CompileException: File 'generated.java', Line 111, Column 64: No applicable constructor/method found for actual parameters "scala.collection.Seq"; candidates are: "com.minute.playground.WithList(scala.collection.immutable.List)"
    

    /* 001 */

    我创建了一个简短的示例代码来说明问题

    import org.apache.spark.sql.{Dataset, SparkSession}
    case class Simple(str: String)
    case class WithList(list : List[String])
    object RddCountFailOnCaseClassWithList {
    
      def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder.appName("WhyLikeThis").master("local[2]").enableHiveSupport.getOrCreate
        import spark.implicits._    
        val df1: Dataset[Simple] = spark.sqlContext.createDataFrame[Simple](List(new Simple("1"))).as[Simple]
        df1.show()
        println(df1.rdd.count())
    
        val df2: Dataset[WithList] = spark.sqlContext.createDataFrame[WithList](List(new WithList(List("1")))).as[WithList]
        df2.show()
        //This will fail !!! ? But why ?
        println(df2.rdd.count())
      }
    }
    

    我做错了什么? 我不应该在模型中使用列表吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   addmeaning    8 年前

    看起来像个bug:) 你没做错什么。看起来像 List 某处转换为 Seq 代码生成器找不到所需的构造函数。 但是,您的代码可以与spark 2.2.0配合使用,因此得到了修复。

    如果要使用spark 2.1.0,可以尝试将实现更改为

    import org.apache.spark.sql.{Dataset, SparkSession}
    
    case class Simple(str: String)
    
    case class WithSeq(list: Seq[String])
    
    object RddCountFailOnCaseClassWithList {
    
      def main(args: Array[String]): Unit = {
        val spark = SparkSession.builder.appName("WhyLikeThis").master("local[2]").enableHiveSupport.getOrCreate
        import spark.implicits._
        val df1: Dataset[Simple] = {
          spark.sqlContext.createDataFrame[Simple](List(Simple("1"))).as[Simple]
        }
        df1.show()
        println(df1.rdd.count())
    
        val df2: Dataset[WithSeq] = spark.sqlContext.createDataFrame[WithSeq](List(WithSeq(List("1")))).as[WithSeq]
        df2.show()
        //hooray, it works! :)
        println(df2.rdd.count())
      }
    }
    
        2
  •  0
  •   renzherl    8 年前

    案例类WithList(列表: Seq公司 [字符串])

    列表为scala。收集 不变的 .列表

    Seq公司 是scala。收集Seq公司

    推荐文章