Apache spark spark sql在Cassandra表之间传输数据

Apache spark spark sql在Cassandra表之间传输数据,apache-spark,cassandra,apache-spark-sql,spark-cassandra-connector,Apache Spark,Cassandra,Apache Spark Sql,Spark Cassandra Connector,请在下面找到卡桑德拉表格 我正在尝试将数据从一个Cassandra表复制到另一个具有相同结构的Cassandra表 请帮帮我 CREATE TABLE data2 ( d_no text, d_type text, sn_perc int, tse_dt timestamp, f_lvl text, ign_f boolean, lk_loc text, lk_ts t

请在下面找到卡桑德拉表格

我正在尝试将数据从一个Cassandra表复制到另一个具有相同结构的Cassandra表

请帮帮我

CREATE TABLE data2 (
        d_no text,
        d_type text,
        sn_perc int,
        tse_dt timestamp,
        f_lvl text,
        ign_f boolean,
        lk_loc text,
        lk_ts timestamp,
        mi_rem text,
        nr_fst text,
        perm_stat text,
        rec_crt_dt timestamp,
        sr_stat text,
        sor_query text,
        tp_dat text,
        tp_ts timestamp,
        tr_rem text,
        tr_type text,
        PRIMARY KEY (device_serial_no, device_type)
    ) WITH CLUSTERING ORDER BY (device_type ASC)
插入的数据使用:

Insert into data2(all column names) values('64FCFCFC','HUM',4,'1970-01-02 05:30:00’ ,’NA’,true,'NA','1970-01-02 05:40:00',’NA’,'NA','NA','1970-02-01 05:30:00','NA','NA','NA','1970-02-03 05:30:00','NA','NA');
注: 当我尝试像这样插入“1970-01-02 05:30:00”时,第4列时间戳,在dtaframe中也正确插入了时间戳,但当从dataframe插入到cassandra并使用select*from table时,我看到它像1970-01-02 00:00:00.000000+0000一样插入

类似地,所有时间戳列都会发生这种情况。 pom.xml

<dependencies>
       <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.spark/spark-sql -->
<dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.datastax.spark/spark-cassandra-connector -->
<dependency>
    <groupId>com.datastax.spark</groupId>
    <artifactId>spark-cassandra-connector_2.11</artifactId>
    <version>2.3.1</version>
</dependency>
但当我尝试使用上面的代码插入数据时,我得到了下面的错误

java.lang.IllegalArgumentException: requirement failed: Invalid row size: 18 instead of 17.
    at scala.Predef$.require(Predef.scala:224)
    at com.datastax.spark.connector.writer.SqlRowWriter.readColumnValues(SqlRowWriter.scala:23)
    at com.datastax.spark.connector.writer.SqlRowWriter.readColumnValues(SqlRowWriter.scala:12)
    at com.datastax.spark.connector.writer.BoundStatementBuilder.bind(BoundStatementBuilder.scala:99)
    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:891)
    at com.datastax.spark.connector.writer.GroupingBatchBuilder.foreach(GroupingBatchBuilder.scala:31)
    at com.datastax.spark.connector.writer.TableWriter$$anonfun$writeInternal$1.apply(TableWriter.scala:233)
    at com.datastax.spark.connector.writer.TableWriter$$anonfun$writeInternal$1.apply(TableWriter.scala:210)
    at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$withSessionDo$1.apply(CassandraConnector.scala:112)
    at com.datastax.spark.connector.cql.CassandraConnector$$anonfun$withSessionDo$1.apply(CassandraConnector.scala:111)
    at com.datastax.spark.connector.cql.CassandraConnector.closeResourceAfterUse(CassandraConnector.scala:145)
    at com.datastax.spark.connector.cql.CassandraConnector.withSessionDo(CassandraConnector.scala:111)
    at com.datastax.spark.connector.writer.TableWriter.writeInternal(TableWriter.scala:210)
    at com.datastax.spark.connector.writer.TableWriter.insert(TableWriter.scala:197)
    at com.datastax.spark.connector.writer.TableWriter.write(TableWriter.scala:183)
    at com.datastax.spark.connector.RDDFunctions$$anonfun$saveToCassandra$1.apply(RDDFunctions.scala:36)
    at com.datastax.spark.connector.RDDFunctions$$anonfun$saveToCassandra$1.apply(RDDFunctions.scala:36)
    at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
    at org.apache.spark.scheduler.Task.run(Task.scala:109)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
这是一个已知的问题()-您正在将启用DSE搜索的表中的数据复制到未启用DSE搜索的表中。您只需在转换过程中删除此列:

val df3 = df2.drop("solr_query").... // your transformations

或者,您可以简单地使用较新的驱动程序(如果您使用的是OSS驱动程序,则为2.3.1)或包含此修复程序的相应DSE版本。

检查
df2.printSchema
df3.printSchema
的输出嘿,谢谢Alex,当我删除solr\u查询时,它工作正常。我是cassandra的新手,我不理解你建议的第二个选项。你能不能请eloborate,上面添加了pom.xml。根据你使用的是什么,有不同的实现-你可以使用DSE分析,然后cassandra连接器就在那里,你可以将它声明为
提供的
依赖项(但您的DSE版本应该有正确的版本-无法说明现在它是在哪个版本中修复的,请与支持人员联系),或者您可以使用外部Spark cluster,然后您可以使用DSE BYOS jar,或者像上面一样使用connector。您使用的是哪个DSE版本?您的意思是说下面的版本?com.datastax.Spark Spark-cassandra-connector_2.11 2.3.1不,我是指DSE本身的版本-您是在DSE上执行Spark作业,还是在单机版Spark?单机版,我在本地安装了1个cassandra实例,远程安装了另一个集群,我在本地执行。。
val df3 = df2.drop("solr_query").... // your transformations