繁体   English   中英

scala.MatchError:在数据帧中

[英]scala.MatchError: in Dataframes

我有一个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)

如果“ Message具有许多不同的字段(如“ List ,并且错误消息指向“ List匹配”错误,那么这就是问题所在。 另外,如果您查看源代码 ,则可以看到List不匹配。

但是,除了深入研究源代码外,这在Java选项卡下的文档中也非常清楚地说明了这一点

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

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

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

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

作为最后的选择,您可以看一下SQLUserDefinedType来定义应如何持久保存该List ,也许可以将其合并在一起。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM