如何保持cassandra中列的顺序

时间:2015-09-30 14:06:47

标签: scala cassandra datastax

我在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(....))?

2 个答案:

答案 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)