una tabla otra into insertar datos cassandra cassandra-cli cqlsh

cassandra - tabla - insertar datos pgadmin 4



¿Cómo seleccionar datos de una tabla e insertarlos en otra tabla? (3)

Para tablas muy grandes, CQLSH tendrá dificultades para manejar COPY TO / FROM. Aquí es cómo barrer la tabla por rangos de token locales y copiar las columnas deseadas de una tabla a otra. Debido a que utiliza la copia local, esto se debe ejecutar en cada nodo del Centro de datos:

#!/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

Quiero seleccionar campos específicos de una tabla en cassandra e insertarlos en otra tabla. Hago esto en un servidor sql como este:

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

¿Cómo hacer esto en cassandra-cli o cqlsh?


Para tablas que no son muy grandes, guárdese el archivo y use una canalización anónima:

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"

Para conjuntos de datos muy grandes, esto no funcionará. Se debe explorar una estrategia de rango por token.


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

aquí indique su espacio de teclas (nombre-esquema) y en lugar de columnfamilyname1 use la tabla a la que desea copiar y en columnfamily2 indique el nombre de la tabla en la que desea copiar.

Y sí, esta es una solución para CQL nunca probada con CLI ..