[英]UPDATE Cassandra table using spark cassandra connector
我在更新鍵空間中的表時遇到了scala上的spark cassandra連接器問題
這是我的一段代碼
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
知道為什么會這樣嗎? 我怎樣才能解決這個問題?
通過spark-cassandra-connector可以更新帶有計數器列的表。 你將不得不使用DataFrames和DataFrameWriter方法保存與模式“追加”(或SaveMode .Append如果您願意)。 檢查代碼DataFrameWriter.scala 。
例如,給出一個表:
cqlsh:test> SELECT * FROM name_counter ;
name | surname | count
---------+---------+-------
John | Smith | 100
Zhang | Wei | 1000
Angelos | Papas | 10
代碼應該如下所示:
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
通過將RDD隱式轉換為DataFrame,可以更簡單地進行DataFrame轉換: import sqlContext.implicits._
並使用.toDF()
。
檢查此玩具應用程序的完整代碼: 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。 自@since 1.4.0
以來, @since 1.4.0
被指定為@Experimental
。
我相信您無法通過SPARK連接器本機更新。 請參閱文檔 :
“Spark Cassandra Connector的默認行為是在插入cassandra表時覆蓋集合。要覆蓋此行為,您可以指定一個自定義映射器,其中包含有關如何處理集合的說明。”
因此,您希望實際使用現有密鑰插入新記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.