Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 将RDD上载到现有Cassandra表时出错_Apache Spark_Cassandra 3.0_Spark Cassandra Connector - Fatal编程技术网

Apache spark 将RDD上载到现有Cassandra表时出错

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).

我使用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).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]