![](/img/trans.png)
[英]Spark excel: reading excel file with multi line header throw an exception: Method threw 'scala.MatchError' exception
[英]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.