我在Cassandra有两张桌子:
CREATE TABLE table1 (
name text PRIMARY KEY,
grade text,
labid List<int>);
CREATE TABLE table2(
name text PRIMARY KEY,
deptid List<int>
grade text,);
例如:
val result: RDD[String, String, List[Int]] = myFunction();
result.saveToCassandra(keyspace, table1)
工作正常。 但如果使用以下行:
result.saveToCassandra(keyspace, table2)
出现此类错误:com.datastax.spark.connector.types.TypeConversionException:无法将类型为java.lang.String的对象test_data转换为List [AnyRef]
是否有任何解决方案使用SomeColumns满足两个表[我们不知道将执行哪个表]。例如:
result.saveToCassandra(keyspace, table, SomeColumns(....))?
答案 0 :(得分:1)
默认情况下,数据框架构只关心位置,而不关心列名,因此如果您的c *表具有不同的列顺序,则会得到错误的写入。解决方案就像你说的那样,使用SomeColumns
。
val columns = dataFrame.schema.map(_.name: ColumnRef)
dataFrame.rdd.saveToCassandra(keyspaceName, tableName, SomeColumns(columns: _*))
现在,数据帧列将使用其名称而不是位置写入c *。
答案 1 :(得分:0)
您的参数应该按不同的顺序排列,因为这些表具有不同的列类型:
val result: RDD[String, String, List[Int]] = myFunction();
val reorder: RDD[String, List[Int], String] = result.map(r => r._1, r._3, r._2)
reorder.saveToCassandra(keyspace, table2)