scala.MatchError:在Dataframes中

Kau*_*hal 0 java scala apache-spark spark-streaming apache-spark-sql

我有一个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");
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误

/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)
Run Code Online (Sandbox Code Playgroud)

Ako*_*chy 5

如果Message有许多不同的字段List,并且错误消息指向List匹配错误,那就是问题.此外,如果您查看源代码,您可以看到List不在匹配中.

但除了在源代码中进行挖掘之外,Java选项卡下的文档中也清楚地说明了这一点:

目前,Spark SQL不支持包含嵌套或包含复杂类型(如Lists或Arrays)的JavaBean.

您可能希望切换到Scala,因为它似乎在那里得到支持:

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

所以解决方案是使用Scala或List从JavaBean中删除.

作为最后的手段,您可以查看SQLUserDefinedType来定义List应该如何保留它,也许可以将它们一起破解.