2012-09-10 373 views
7

Estoy planeando agregar datos incrementales a diario a una tabla de BigQuery. Cada vez que agrego datos incrementales a la tabla existente, quiero eliminar los registros duplicados (basados ​​en una columna de clave principal) de los datos existentes en la tabla. Un enfoque sería -Eliminación de registros duplicados en una tabla de BigQuery

  1. recoja el conjunto de claves de los datos incrementales (llamémosle INCR_KEYS)
  2. ejecutar una consulta en las líneas de - SELECT all_cols from table where pkey_col NOT IN (INCR_KEYS) - y almacenar los resultados en una tabla nueva.
  3. Agregue los datos incrementales a la nueva tabla.

Mi preocupación con este enfoque es que crea una copia duplicada de una gran mesa y se agrega a mis cuentas.

¿Existe una forma mejor de lograr lo mismo sin crear una tabla duplicada?

+0

¿Qué tan grande es la tabla? Si se comprime más de 64 MB, el # 2 fallará. –

+0

@RyanBoyd - Eso no debería ser un problema. Si INCR_KEYS> 64MB, podría dividir INCR_KEYS en trozos más pequeños y repetir <2> – user1659408

+0

El problema es si la tabla completa (es decir, los datos que no están en INCR_KEYS) es> 64MB. La consulta SELECT en # 2 no tendrá éxito. –

Respuesta

4

No sabía de una manera de hacer esto sin crear una tabla duplicada, esto realmente suena como una solución bastante inteligente.

Sin embargo, es probable que el costo incremental para usted sea muy pequeño: BigQuery solo le factura los datos durante el tiempo que exista. Si elimina la tabla anterior, solo deberá pagar ambas tablas por un período de segundos o minutos.

+0

Gracias @Jordan, ¡puedo vivir con eso! Sería genial si alguien pudiera sugerir una solución sin involucrar tablas duplicadas. – user1659408

1

Se puede ejecutar la consulta con la tabla de destino se establece en la tabla existente y establecer la disposición de escritura para truncar:

bq query --allow_large_results --replace --destination_table=mydataset.mytable \ 
    'SELECT * FROM mydataset.mytable 
    WHERE key NOT IN (SELECT key FROM mydataset.update)' 
bq cp --append_table mydataset.update mydataset.mytable 

creo que esto va a funcionar, pero creo que vale la pena tomar una copia de seguridad, especialmente en lo puedes eliminarlo poco después.

bq cp mydataset.mytable mydataset.backup 
# You can also build the new table in one pass: 
bq query --allow_large_results --replace --destination_table=mydataset.mytable \ 
    'SELECT * FROM (
     SELECT * FROM mydataset.mytable 
     WHERE key NOT IN (SELECT key FROM mydataset.update) 
    ), (
     SELECT * FROM mydataset.update 
    )' 
bq rm mydataset.backup 
+0

¿Cómo funcionaría exactamente esto y cómo está llenando mydataset.update? –

0

Se puede establecer una nueva tabla de destino y simplemente consultar un recuento y el grupo de todas las columnas:

SELECT 
    FIELD1, 
    FIELD2, 
    FIELD3, 
    FIELD4 
FROM (
    SELECT 
    COUNT (*), 
    FIELD1, 
    FIELD2, 
    FIELD3, 
    FIELD4 
    FROM 
    [<TABLE>] 
    GROUP BY 
    FIELD1, 
    FIELD2, 
    FIELD3, 
    FIELD4) 
Cuestiones relacionadas