簡體   English   中英

如何在Cassandra中將列從一個鍵空間移到另一鍵空間

[英]How to move columns from one keyspace to other in Cassandra

我是否可以將下面提到的某些列(cc_payment,keyid)從Cassandra密鑰空間billing轉移到其他Cassandra payments密鑰空間? payment_info將是一個新表。

我有什么辦法可以移動的嗎? 還是我需要復制到csv文件並使用COPY FROM選項導入? 由於數據量巨大,我正在尋找可以直接從一個鍵空間移到另一個鍵空間的選項。 我們正在使用datastax cassandra。

感謝您的幫助。

    FROM
========

keyspace:  billing
create table if not exists billing_info (
      user_id text,
      billing_id timeuuid,
      cc_payment frozen<cc_payment>,
      keyid text;
      PRIMARY KEY((user_id), billing_id)
) WITH CLUSTERING ORDER BY (billing_id DESC);

    TO
======
keyspace:  payments
create table if not exists payment_info (
      user_id text,
      payment_id timeuuid,
      cc_payment frozen<cc_payment>,
      keyid text;
      PRIMARY KEY((user_id), payment_id)
) WITH CLUSTERING ORDER BY (payment_id DESC);

有多種方法可以做到這一點:

直接復制文件,然后更改表結構

由於表僅以一個列名不同,因此直接復制文件可能會更快,如下所示:

  • 創建一個表payments.payment_info具有完全相同的結構billing.billing_info
  • 停止寫入billing.billing_info

然后在群集的每個節點上,執行以下操作:

  • 對其進行刷新: nodetool flush billing billing_info
  • 轉到Cassandra的數據目錄
  • 在運行Cassandra的同一用戶下,將文件billing/billing_info-<ID_of_the_table>/*復制到payments/payment_info-<ID_of_the_table>/
  • 執行nodetool refresh payments.payment_info`
  • 在cqlsh中檢查數據是否可用
  • 使用以下命令對列進行重命名: ALTER TABLE payments.payment_info RENAME billing_id TO payment_id ;

通過使用例如DSBulk或Spark復制來遷移數據。

如果使用的是DSE,則可以使用DSBulk (最好使用最新版本)從一個表中卸載數據並加載到另一個表中。 通過將數據寫入標准輸出並通過Unix管道從標准輸入中讀取數據,此命令可能無需創建中間副本就可以工作,盡管在這種情況下它會變慢,因為它無法實現必要的並行性。

在最簡單的情況下,將按以下方式調用它,以提供更改的字段名稱之間的映射(有關詳細信息,請參見文檔0:

dsbulk unload -k ks1 -t table1 -c json | dsbulk load -k ks2 -t table2 -c json -m "mapping_to_accomodate_changes_in_field_names"

但是,如果您不僅需要復制數據,還需要復制其他內容(例如TTL和WriteTime),則任務將更加復雜-在這種情況下,您需要顯式導出數據,然后分批加載數據,分別用於每個列。

Spark您可以使用這個小片段。 您可以在updateColumns中完成所需的操作

val myKeyspace = "oldkeyspace" 
val myTable = "oldtable"
val newKeyspace = "newkeyspace" 
val newTable = "newtabl"

def updateColumns(row: CassandraRow): CassandraRow = { 
     val inputMap = row.toMap val newData = Map( "newColumn" -> "somevalue" ) 
     var outputMap = inputMap ++ newData CassandraRow.fromMap(outputMap) 
}

val result = sc.cassandraTable(myKeyspace, myTable) .map(updateColumns(_)) 
  .saveToCassandra(newKeyspace, newTable)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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