【问题标题】:scala.MatchError: in Dataframesscala.MatchError:在数据帧中
【发布时间】:2015-08-28 10:40:43
【问题描述】:

我有一个Spark (version 1.3.1) 应用程序。其中,我正在尝试将一个 Java bean RDD JavaRDD<Message> 转换为 Dataframe,它有许多不同数据类型(整数、字符串、列表、映射、双精度)的字段。

但是什么时候,我正在执行我的代码。

messages.foreachRDD(new Function2<JavaRDD<Message>,Time,Void>(){
            @Override
            public Void call(JavaRDD<Message> arg0, Time arg1) throws Exception {
                SQLContext sqlContext = SparkConnection.getSqlContext();
                DataFrame df = sqlContext.createDataFrame(arg0, Message.class);
                df.registerTempTable("messages");

我收到了这个错误

/06/12 17:27:40 INFO JobScheduler: Starting job streaming job 1434110260000 ms.0 from job set of time 1434110260000 ms
15/06/12 17:27:40 ERROR JobScheduler: Error running job streaming job 1434110260000 ms.1
scala.MatchError: interface java.util.List (of class java.lang.Class)
    at org.apache.spark.sql.SQLContext$$anonfun$getSchema$1.apply(SQLContext.scala:1193)
    at org.apache.spark.sql.SQLContext$$anonfun$getSchema$1.apply(SQLContext.scala:1192)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.mutable.ArrayOps$ofRef.map(ArrayOps.scala:108)
    at org.apache.spark.sql.SQLContext.getSchema(SQLContext.scala:1192)
    at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:437)
    at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:465)

【问题讨论】:

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


    【解决方案1】:

    如果Message 有许多不同的字段,例如List,并且错误消息指向List 匹配错误,那就是问题所在。此外,如果您查看the source code,您会发现List 不在匹配项中。

    但是除了在源代码中挖掘之外,这在文档here under the Java tab 中也非常清楚地说明了

    目前,Spark SQL 不支持包含嵌套或复杂类型(如列表或数组)的 JavaBean。

    您可能想切换到 Scala,因为那里似乎支持它:

    案例类也可以嵌套或包含复杂类型,例如序列或数组。这个RDD可以隐式转换为DataFrame,然后注册为表。

    因此解决方案是使用 Scala 或从您的 JavaBean 中删除 List

    作为最后的手段,您可以查看SQLUserDefinedType 来定义List 应该如何被持久化,也许可以将它破解在一起。

    【讨论】:

      【解决方案2】:

      我通过将我的 Spark 版本从 1.3.1 更新到 1.4.0 解决了这个问题。现在,它可以工作了。

      【讨论】:

        猜你喜欢
        • 2023-03-07
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        相关资源
        最近更新 更多