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 ..