Apache spark 将RDD上载到现有Cassandra表时出错
我使用Dataframe连接器函数从Cassandra表中提取内容。之后,我对数据帧执行一些过滤(无转换),然后我想再次将其写入现有表中。为此,我需要首先将DF转换为RDD。我使用以下命令执行此操作: 为此,我使用了以下代码:Apache spark 将RDD上载到现有Cassandra表时出错,apache-spark,cassandra-3.0,spark-cassandra-connector,Apache Spark,Cassandra 3.0,Spark Cassandra Connector,我使用Dataframe连接器函数从Cassandra表中提取内容。之后,我对数据帧执行一些过滤(无转换),然后我想再次将其写入现有表中。为此,我需要首先将DF转换为RDD。我使用以下命令执行此操作: 为此,我使用了以下代码: results.rdd.map(row=> (row.get(0).asInstanceOf[String], row.get(1).asInstanceOf[String], row.get(2).asInstanceOf[String], row.get(3).
results.rdd.map(row=> (row.get(0).asInstanceOf[String], row.get(1).asInstanceOf[String], row.get(2).asInstanceOf[String], row.get(3).asInstanceOf[java.util.UUID], row.get(4).asInstanceOf[String], row.get(5).asInstanceOf[String], row.get(6).asInstanceOf[Long], row.get(7).asInstanceOf[Set[String]], row.get(8).asInstanceOf[Array[Byte]], row.get(9).asInstanceOf[String], row.get(10).asInstanceOf[String], row.get(11).asInstanceOf[Set[String]], row.get(12).asInstanceOf[Set[String]], row.get(13).asInstanceOf[Set[String]], row.get(14).asInstanceOf[String], row.get(15).asInstanceOf[List[String]],row.get(16).asInstanceOf[String],row.get(17).asInstanceOf[String]))
我已经检查过了,所有的元素都设置了适当的类型。
现在我想使用results.saveToCassandra(“labels”、“results”、SomeColumns(…)
将此RDD上载到Cassandra,但我得到以下错误
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 73.0 failed 4 times, most recent failure: Lost task 0.3 in stage 73.0 (TID 70606, hdp-worker-5.cloud.mwn.de, executor 172): java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to scala.collection.immutable.Set
at $$$$b42ed3d02f91ffa45dcf288dd693450$$$$$anonfun$1.apply(<console>:65)
at $$$$b42ed3d02f91ffa45dcf288dd693450$$$$$anonfun$1.apply(<console>:65)
at scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
at com.datastax.spark.connector.util.CountingIterator.next(CountingIterator.scala:16)
at com.datastax.spark.connector.writer.GroupingBatchBuilder.next(GroupingBatchBuilder.scala:106)
at com.datastax.spark.connector.writer.GroupingBatchBuilder.next(GroupingBatchBuilder.scala:31)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
org.apache.spark.SparkException:作业因阶段失败而中止:阶段73.0中的任务0失败4次,最近的失败:阶段73.0中的任务0.3丢失(TID 70606,hdp-worker-5.cloud.mwn.de,executor 172):java.lang.ClassCastException:scala.collection.mutable.WrappedArray$ofRef无法转换为scala.collection.immutable.Set
位于$$$$b42ed3d02f91ffa45dcf288dd693450$$$$anonfun$1。应用(:65)
位于$$$$b42ed3d02f91ffa45dcf288dd693450$$$$anonfun$1。应用(:65)
位于scala.collection.Iterator$$anon$11.next(Iterator.scala:409)
在com.datastax.spark.connector.util.CountingIterator.next(CountingIterator.scala:16)上
在com.datastax.spark.connector.writer.GroupingBatchBuilder.next(GroupingBatchBuilder.scala:106)上
在com.datastax.spark.connector.writer.GroupingBatchBuilder.next(GroupingBatchBuilder.scala:31)
位于scala.collection.Iterator$class.foreach(Iterator.scala:893)
问题是设置了多个列的Cassandra类型,这意味着我的scala类型需要是Set[String](或TreeSet或HashSet-我对它们都进行了测试)的类型,我得到了这个错误。如何正确格式化数据类型以上载到Cassandra
编辑:
我根据第一条建议更新了代码:
results.rdd.map(row=>(row.getString(0)、row.getString(1)、row.getString(2)、row.get[java.util.UUID](3)、row.getString(4)、row.getString(5)、row.get[java.util.Date](6)、row.get[Seq[String]](7).toSet、row.get[Array[Byte]](8)、row.getString(9)、row.getString(10)、row.getSeq[String](11).toSet、row.get[Seq[Seq[String]](12).toSet、row.get[Seq][String]](13).toSet,row.getString(14),row.get[List[String]](15),row.getString(16),row.getString(17)))
但我不断发现与几个条目相关的错误:
:65:error:method get:(i:Int)Any不接受类型参数。
asInstance
不会将数据转换为它不是的东西。相反,您应该转换它(通常使用类型化getter而不是asInstanceOf
):
此代码中可能存在其他错误,尤其是:
row.get(3).asInstanceOf[java.util.UUID]
看起来很时髦,因为Spark没有UUID
类型
相关的您建议的解决方案会为getSeq[String]、getString等引发其他错误。这与我的建议不完全相同。键入的方法可能是
getString
、getInt
、getLong
等,也可能是getAs[T]
。我从来没有说过有get[T]
,您可以看到,没有。为您的数据定义一个case类并直接读入其中不是更容易吗?如下所述:
row.get(3).asInstanceOf[java.util.UUID]