簡體   English   中英

使用spark cassandra連接器更新Cassandra表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM