2017-08-04 2 views
0

Les propriétés ACID Ruches permettent de supprimer les lignes d'une table en utilisant la syntaxe suivante:Hive supprimer la ligne avec clé primaire composite

DELETE FROM table 
WHERE id IN (SELECT id FROM raw_table) 

Mais quelle est la meilleure solution pour supprimer des lignes lorsque la primary_key se compose de plusieurs colonnes ?

J'ai essayé ce qui suit avec un EXISTE:

DELETE FROM table 
WHERE EXISTS (SELECT id1, id2 FROM raw_table 
       WHERE raw_table.id1 = table.id1 AND raw_table.id2 = table.id2) 

Ou le suivant (concaténer toutes les colonnes, pas sûr si cela est valide):

DELETE FROM table 
WHERE CONCAT(id1, id2) IN (SELECT CONCAT(id1, id2) FROM raw_table) 

Avez-vous des conseils sur la Quelle est la meilleure solution?

Répondre

0

La solution utilisant existe est valide. En outre, votre solution valeurs concaténer est valide, mais en fonction des valeurs que vous pourriez trouver que vous pourriez être la suppression de données que vous ne voulez pas, par exemple

id1: 01 
id2: 1 

vous serez avec 011 effacez des lignes, mais il Correspondre aussi avec

id1: 0 
id2: 11 

ce qui n'est pas prévu. Je suggère d'ajouter un délimiteur entre les identifiants.

DELETE FROM table 
WHERE CONCAT(id1, id2) IN (SELECT CONCAT(CONCAT(id1,"-"), id2) FROM raw_table) 

Les deux solutions doivent effectuer seulement 1 emploi avec mappeur et réduire la phase, donc le plan d'exécution et les performances devraient être à peu près les mêmes

Cordialement!

+0

Merci beaucoup pour votre réponse. Je suis allé avec la première approche en utilisant les EXISTS, pensez-vous que cela prendra plus de temps? –

+0

Je viens d'éditer ma réponse. – hlagos