使用spark cassandra连接器更新Cassandra表

时间:2015-08-05 23:13:31

标签: scala apache-spark cassandra-2.0 apache-spark-sql spark-cassandra-connector

我在更新密钥空间中的表时遇到了scala上的spark cassandra连接器问题<​​/ p>

这是我的一段代码

val query = "UPDATE " + COLUMN_FAMILY_UNIQUE_TRAFFIC + DATA_SET_DEVICE +
                        " SET a= a + " + b + " WHERE x=" +
                        x + " AND y=" + y +
                        " AND z=" + x

println(query)

val KeySpace    = new CassandraSQLContext(sparkContext)
KeySpace.setKeyspace(KEYSPACE)

hourUniqueKeySpace.sql(query)

执行此代码时,我收到类似

的错误
Exception in thread "main" java.lang.RuntimeException: [1.1] failure: ``insert'' expected but identifier UPDATE found

知道为什么会这样吗? 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

通过spark-cassandra-connector可以更新具有counter column的表。您必须使用DataFrames和DataFrameWriter方法保存模式“append”(或SaveMode。如果您愿意,请附加)。检查代码DataFrameWriter.scala

例如,给出一个表:

<html>
<head>
<title>DS18B20</title>
<meta http-equiv="Refresh" content="10" />
<script src="/jstest1/jquery-1.12.3.js"></script>
<script src="/jstest1/highstock.js"></script>
<script src="/jstest1/exporting.js"></script>
</head>
<body>
<div id="container" style="height: 500px; min-width: 500px"></div>
</body>
</html>

代码应如下所示:

$(function() {
        $.getJSON('/jstest1/values.php', function (data) {
// Create the chart
    $('#container').highcharts('StockChart', {
        rangeSelector : {
            selected : 1
        },
        title : {
            text : 'Temperature'
        },
        series : [{
            name : 'Temperature',
            data : data,
            marker : {
                enabled : true,
                radius : 3
            },
            shadow : true,
            tooltip : {
                valueDecimals : 2
            }
        }]
    });
});
});

更新后:

cqlsh:test> SELECT * FROM name_counter ;

 name    | surname | count
---------+---------+-------
    John |   Smith |   100
   Zhang |     Wei |  1000
 Angelos |   Papas |    10

通过隐式转换RDD to a DataFrameval updateRdd = sc.parallelize(Seq(Row("John", "Smith", 1L), Row("Zhang", "Wei", 2L), Row("Angelos", "Papas", 3L))) val tblStruct = new StructType( Array(StructField("name", StringType, nullable = false), StructField("surname", StringType, nullable = false), StructField("count", LongType, nullable = false))) val updateDf = sqlContext.createDataFrame(updateRdd, tblStruct) updateDf.write.format("org.apache.spark.sql.cassandra") .options(Map("keyspace" -> "test", "table" -> "name_counter")) .mode("append") .save() 并使用 name | surname | count ---------+---------+------- John | Smith | 101 Zhang | Wei | 1002 Angelos | Papas | 13 ,可以更轻松地进行DataFrame转换。

检查此玩具应用程序的完整代码: https://github.com/kyrsideris/SparkUpdateCassandra/tree/master

由于版本在这里非常重要,以上内容适用于Scala 2.11.7,Spark 1.5.1,spark-cassandra-connector 1.5.0-RC1-s_2.11,Cassandra 3.0.5。 自import sqlContext.implicits._以来,DataFrameWriter被指定为.toDF()

答案 1 :(得分:2)

我认为您无法通过SPARK连接器本机更新。请参阅documention

&#34; Spark Cassandra Connector的默认行为是在插入cassandra表时覆盖集合。要覆盖此行为,您可以指定自定义映射器,其中包含有关如何处理集合的说明。&#34;

因此,您希望实际使用现有密钥插入新记录。