2015-08-13 2 views
1

У меня есть база данных Cassandra 2.1.8 с кучей таблиц, все в форме «prefix1_tablename» или «prefix2_tablename».CQL3.2: DROP TABLE с определенным префиксом?

Я хочу УБЫТЬ каждую таблицу, которая начинается с prefix1_, и оставить что-нибудь еще в покое.

Я знаю, что могу захватить имена таблиц с помощью запроса:

SELECT columnfamily_name FROM system.schema_columnfamilies 
WHERE keyspace_name='mykeyspace' 

И я подумал о фильтрации результатов как-то получить только prefix1_ таблицы, поместив их в таблицу с DROP TABLE предваряется каждого из них, а затем выполняя все инструкции в моей новой таблице. Это было похоже на стратегии, которые я видел для людей, решающих ту же проблему с MySQL или Oracle.

С CQL3.2, однако, у меня нет доступа к пользовательским функциям (по крайней мере, согласно документам, которые я прочитал ...), и я не знаю, как сделать что-то вроде выполнения операторов off результата запроса таблицы, а также как отфильтровать таблицы префикса1_ без оператора LIKE в Кассандре.

Есть ли способ сделать это?

ответ

1

Я придумал сценарий оболочки Bash, чтобы решить мою собственную проблему. Как только я понял, что могу экспортировать таблицу семейств столбцов в CSV-файл, мне было более полезно выполнять фильтрацию и обработку текста с помощью grep и awk, а не искать «чистый» метод cqlsh.

Сценарий я использовал:

#!/bin/bash 

# No need for a USE command by making delimiter a period 
cqlsh -e "COPY system.schema_columnfamilies (keyspace_name, columnfamily_name) 
TO 'alltables.csv' WITH DELIMITER = '.';" 

cat alltables.csv | grep -e '^mykeyspace.prefix1_' \ 
    | awk '{print "DROP TABLE " $0 ";"}' >> remove_prefix1.cql 

cqlsh -f 'remove_prefix1.cql' 

rm alltables.csv remove_prefix1.cql 
+1

Красиво сделано! Это A) удивительный и B) именно то, что я собираюсь предложить. – Aaron

Смежные вопросы