簡體   English   中英

Cassandra:向表中添加新列

[英]Cassandra: Adding new column to the table

您好,我剛剛在我的表 my_table 中添加了一個新列 Business_sys:

   ALTER TABLE my_table ALTER business_sys TYPE set<text>;

但是我又一次刪除了這個列名,因為我想更改列的類型:

  ALTER TABLE my_table DROP business_sys;

當我再次嘗試添加具有不同類型的相同列名時,我收到錯誤消息

"Cannnot add a collection with the name business_sys because the collection with the same name and different type has already been used in past"

我只是嘗試執行此命令以添加具有不同類型的新列-

  ALTER TABLE my_table ADD business_sys list<text>;

我做錯什么了? 我是 Cassandra 的新手。有什么建議嗎?

遇到了 CASSANDRA-6276 問題是當您在 Cassandra 中刪除一列時,該列中的數據不會消失,並且 Cassandra 可能會嘗試使用其新的比較器類型讀取該數據。

從鏈接的 JIRA 票證:

不幸的是,我們不能允許從比較器中刪除組件,包括從 ColumnToCollectionType 中刪除單個集合列。 如果我們確實允許這樣做,並且有這種類型的預先存在的數據,C* 根本不知道如何比較這些......

...即使我們這樣做了,並允許 [users] 使用相同的名稱創建不同的集合,我們也會遇到一個不同的問題:新集合的比較器將用於比較可能不兼容的類型。

JIRA 建議這在 Cassandra 3.x 中可能不是問題,但我只是在 3.0.3 中嘗試過它並且失敗並出現相同的錯誤。

我做錯了什么? 我對 Cassandra 很陌生。 有什么建議嗎?

不幸的是,解決這個問題的唯一方法是為您的新列表使用不同的名稱。

編輯:我已經在 Cassandra 中嘗試過這個,結果丟失的數據不一致。 最好的方法是按照CASSANDRA-6276 中的建議更改列名 並始終遵循文檔指南:)

-警告-根據CASSANDRA-6276 的評論,運行以下解決方法是不安全的。

詳細說明@masum 的評論 - 可以通過首先使用非集合類型(例如int重新創建列來解決該限制。 之后,您可以刪除並使用新的集合類型重新創建。

從您的示例中,假設我們有一個 business_sys 集:

ALTER TABLE my_table ADD business_sys set<text>;
ALTER TABLE my_table DROP business_sys;

現在將列重新添加為 int 並再次刪除它:

ALTER TABLE my_table ADD business_sys int;
ALTER TABLE my_table DROP business_sys;

最后,您可以重新創建名稱相同但集合類型不同的列:

ALTER TABLE my_table ADD business_sys list<text>;

Cassandra 不允許您重新創建具有相同名稱和相同數據類型的列,但有一種解決方法可以修復它。

一旦刪除了 SET 類型的列,就可以僅使用另一種“默認”類型(例如 varchar 或 interger)重新創建它。 使用其中一種類型重新創建后,您可以再次刪除該列,最后使用正確的類型重新創建。

我在下面說明了它

ALTER TABLE my_table DROP business_sys;           # the drop you've done
ALTER TABLE my_table ADD business_sys varchar;    # recreating with another type
ALTER TABLE my_table DROP business_sys;           # dropping again
ALTER TABLE my_table ADD business_sys list<text>; # recreating with proper type

暫無
暫無

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

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