web-dev-qa-db-fra.com

Comment charger des données sur Hive à partir de HDFS sans supprimer le fichier source?

Lorsque vous chargez des données de HDFS vers Hive, utilisez

LOAD DATA INPATH 'hdfs_file' INTO TABLE tablename;

commande, on dirait que le fichier hdfs_file est déplacé vers Hive/warehouse dir. Est-il possible (comment?) De le copier au lieu de le déplacer pour que le fichier soit utilisé par un autre processus.

46
Suge

de votre question, je suppose que vous avez déjà vos données en HDFS. Donc, vous n'avez pas besoin de LOAD DATA, qui déplace les fichiers vers l'emplacement par défaut de Hive /user/Hive/warehouse. Vous pouvez simplement définir la table en utilisant le externalkeyword, qui laisse les fichiers en place, mais crée la définition de la table dans le métastore Hive. Voir ici: Create Table DDL eg .:

create external table table_name (
  id int,
  myfields string
)
location '/my/location/in/hdfs';

Veuillez noter que le format que vous utilisez peut différer de celui par défaut (comme mentionné par JigneshRawal dans les commentaires). Vous pouvez utiliser votre propre délimiteur, par exemple lorsque vous utilisez Sqoop:

row format delimited fields terminated by ','
83
Dag

J'ai constaté que, lorsque vous utilisez ensemble EXTERNAL TABLE et LOCATION, Hive crée une table et que, au départ, aucune donnée ne sera présente (en supposant que l'emplacement de vos données soit différent de celui de Hive 'LOCATION').

Lorsque vous utilisez la commande 'LOAD DATA INPATH', les données sont déplacées (au lieu d'être copiées) d'un emplacement de données vers un emplacement que vous avez spécifié lors de la création de la table Hive.

Si l'emplacement n'est pas indiqué lors de la création de la table Hive, il utilise l'emplacement interne de l'entrepôt Hive et les données seront déplacées de votre emplacement de données source vers l'emplacement de l'entrepôt de données Hive interne (c'est-à-dire/user/Hive/warehouse /).

5
Avinash

Une alternative à 'LOAD DATA' est disponible dans laquelle les données ne seront pas déplacées de votre emplacement source existant vers l'emplacement de l'entrepôt de données Hive.

Vous pouvez utiliser la commande ALTER TABLE avec l'option 'LOCATION'. Voici la commande requise ci-dessous

ALTER TABLE table_name ADD PARTITION (date_col='2017-02-07') LOCATION 'hdfs/path/to/location/'

La seule condition est que l'emplacement doit être un répertoire au lieu d'un fichier.

J'espère que cela résoudra le problème.

3
Avinash