Как выбрать данные из таблицы и вставить в другую таблицу?

Я хочу выбрать определенные поля таблицы в кассандре и вставить их в другую таблицу. Я делаю это на сервере sql следующим образом:

INSERT INTO Users(name,family)
SELECT name,family FROM Users

Как это сделать в cassandra-cli или cqlsh?


person ehsan shirzadi    schedule 26.01.2014    source источник
comment
в вашей таблице есть какой-либо столбец с типом данных UUID?   -  person Helping Hand..    schedule 19.06.2014


Ответы (3)


COPY keyspace.columnfamily1 (column1, column2,...) TO 'temp.csv';
COPY keyspace.columnfamily2 (column1, column2,...) FROM 'temp.csv';

здесь укажите свое ключевое пространство (имя схемы) и вместо столбцаfamilyname1 используйте таблицу, в которую вы хотите скопировать, и в столбцеfamily2 укажите имя таблицы, в которую вы хотите скопировать..

И да, это решение для CQL, однако я никогда не пробовал с CLI.

person Helping Hand..    schedule 27.01.2014
comment
Это работает для cqlsh, но не для CQL в целом. Однако он поддерживается в DataStax. - person Kirill Taran; 08.09.2020

Для не очень больших таблиц сохраните файл и используйте анонимный канал:

cqlsh -e "COPY keyspace.src_table (col1, col2, ...,ColN ) TO STDOUT WITH HEADER=false" | cqlsh -e "COPY keyspace.target_table (col1, col2, ...,ColN ) FROM STDIN" 

Для очень больших наборов данных это не сработает. Следует изучить стратегию диапазона токенов.

person Jose Martinez Poblete    schedule 05.02.2017

Для очень больших таблиц CQLSH будет трудно обрабатывать COPY TO/FROM. Вот как можно очистить таблицу по диапазонам локальных токенов и скопировать нужные столбцы из одной таблицы в другую. Поскольку он использует локальную копию, это должно быть выполнено на каждом узле центра обработки данных:

    #!/bin/bash
    #
    # Script to COPY from a SOURCE table's select columns over a TARGET table
    # Assumes the following:
    #
    # * The SOURCE table is very large - otherwise just try:
    #   cqlsh  -e "COPY keyspace.src_table (col1, col2, ...,ColN ) TO STDOUT WITH HEADER=false" \
    #   |cqlsh -e "COPY keyspace.tgt_table (col1, col2, ...,ColN ) FROM STDIN"
    # * SOURCE AND TARGET TABLES are in the SAME KEYSPACE
    # * TARGET columns are named the SAME as SOURCE
    #
    # The script sweeps thru the local tokens to copy only the local data over to the new table
    # Therefore, this script needs to run on every node on the datacenter
    #
    # Set these variables before executing
    #
    USR=cassandra
    PWD=password
    KSP=my_keyspace
    SRC=src_table
    COL="col1, col2, col3"
    PKY="col1"
    TGT=tgt_table

    CQLSH="cqlsh -u ${USR} -p ${PWD} -k ${KSP}"

    function getTokens(){
       for i in $($CQLSH -e "select tokens from system.local;" | awk -F, '/{/{print $0}' | tr -d '{' | tr -d '}' | tr -d ','); do
           echo ${i//\'/}
       done | sort -n
    }

    function getDataByTokenRange(){
       i=0
       tokens=($(getTokens))
       while [ ${i} -lt ${#tokens[@]} ]; do 
             [ ${i} -eq 0 ]         && echo "SELECT ${COL} FROM ${SRC} WHERE token(${PKY}) <= ${tokens[i]};" 
             [ "${tokens[i+1]}" ]   && echo "SELECT ${COL} FROM ${SRC} WHERE token(${PKY}) >  ${tokens[i]} AND token(${PKY}) <= ${tokens[i+1]};"
             [ ! "${tokens[i+1]}" ] && echo "SELECT ${COL} FROM ${SRC} WHERE token(${PKY}) >  ${tokens[i]};"
             ((i++))
       done
    } 

function cqlExec(){ 
  while IFS='' read -r cql || [[ -n "$line" ]]; do
    $CQLSH -e "CONSISTENCY LOCAL_ONE; $cql"                                                                \
    |awk -F\| '( !/LOCAL_ONE/ && !/'"${COL/, /|}"'/ && !/^\-+/ && !/^\([0-9]+ rows)/ && !/^$/ ){print $0}' \
    |sed -e 's/^[ ]*//g' -e 's/[ ]*|[ ]*/|/g'                                                              \
    |$CQLSH -e "COPY ${TGT} (${COL}) FROM STDIN WITH DELIMITER = '|' and HEADER=false;"
    [ "$?" -gt 0 ] && echo "ERROR: Failed to import data from command: ${command}"
  done < "$1"
}

    main(){
       echo "Begin processing ..."
       getDataByTokenRange > getDataByTokenRange.ddl
       cqlExec getDataByTokenRange.ddl
       echo "End procesing"
    }

    main
person Jose Martinez Poblete    schedule 05.02.2017