2017-10-09 11 views
0

Je suis en train d'ajouter une partition à une table ruche (cloisonné par date)ajouter dans le tableau ruche basée sur une sous requête

Mon problème est que la date doit être tiré par les cheveux d'une autre table.

Ma requête ressemble:

ALTER TABLE my_table AJOUTER SINON EXISTE PARTITION (server_date = (SELECT max (server_date) DE processed_table));

Quand je lance la ruche requête jette l'erreur suivante:

Erreur: Erreur lors de la compilation déclaration: failed: ligne ParseException 1:84 ne peut pas reconnaître l'entrée dans constante (état « max » près « (» « SELECT » = 42000, code = 40000)

+0

https://issues.apache.org/jira/browse/HIVE-8182 –

Répondre

0

ruche ne permet pas d'utiliser les fonctions/UDF pour la colonne de partition

approche 1:.

pour ce faire, vous pouvez exécuter le premier Qué ry et stockez le résultat dans une variable, puis exécutez la requête.

server_date=$(hive -e "set hive.cli.print.header=false; select max(server_date) from processed_table;") hive -hiveconf "server_date"="$server_date" -f your_hive_script.hql

l'intérieur de votre script, vous pouvez utiliser l'instruction suivante:

ALTER TABLE my_table ADD IF NOT EXISTS PARTITION(server_date =${hiveconf:server_date});

Pour plus d'informations sur la substitution de variables ruche, vous pouvez consulter link

Approche 2:

Dans cette approche, vous devrez créer une table temporaire si les données de partition que vous attendez ing n'est déjà chargé dans aucune autre table partitionnée. Considérant que vos données n'ont pas la colonne server_date.

  1. charger les données dans la table temporaire
  2. ensemble hive.exec.dynamic.partition = true;
  3. exécuter la requête suivante:

INSERT OVERWRITE TABLE my_table PARTITION (server_date) SELECT b.column1, b.column2,........,a.server_date as server_date FROM (select max(server_date) as server_date from) a, my_table b;

+0

Est-ce que toute l'approche ci-dessus a travaillé pour vous? –

+0

J'ai utilisé le code JDBC, et semble fonctionner ... –