我在更新密钥空间中的表时遇到了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
知道为什么会这样吗? 我该如何解决这个问题?
答案 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 DataFrame:val 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;
因此,您希望实际使用现有密钥插入新记录。