2016-01-26 3 views
0

J'ai un fichier csv avec un tableau de structs où tout est délimité par ','. Après le champ ID, les données contiennent des tableaux de triplets de coordonnées X, Y et Z.Hive: créer une table avec des tableaux de struct à partir du fichier csv où tout est délimité par des virgules

ID, X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3,... 
1,1,2,3,4,5,6,7,8,9 
2,4,5,6,7,8,9 
3,10,11,12 
4,15,16,17,18,19,20,25,26,27 

J'ai essayé d'utiliser le code suivant pour créer la table Hive qui aurait travaillé si mes champs, objets de collection et les clés de carte ont été delimted avec des personnages différents. Cependant, puisque tout est délimité par une virgule, il a échoué. Vous vous demandez s'il existe une solution alternative pour cette situation.

CREATE TABLE IF NOT EXISTS Hivetable (
    ID    INT, 
    XYZ    array<STRUCT<X:DOUBLE, Y:DOUBLE, Z:DOUBLE>> 
) 
row format delimited                      
fields terminated by ',' 
collection items terminated by ',' 
map keys terminated by ',' 
stored as textfile 
; 

LOAD DATA local INPATH 'Path/datafile.csv' OVERWRITE INTO TABLE Hivetable; 
+0

C'est pur masochisme. Hive a été conçu pour exécuter des requêtes ** déclaratives ** de type SQL sur des données ** structurées **. Vos données sont un désordre non structuré qui nécessite un code ** procédural ** (c'est-à-dire des boucles) pour le structurer. Boom. –

+0

Je vous conseille de développer un programme Java court pour traiter le désordre d'entrée, line-by-llne, et l'exploser dans un fichier CSV avec un nombre de colonnes fixe. Ensuite, vous pouvez commencer à jouer avec Hive. –

Répondre

2

entrée de fichier SCV doit être:

1,1;2;3#4;5;6#7;8;9 
2,4;5;6#7;8;9 

Table création:

CREATE TABLE IF NOT EXISTS Hivetable (

    ID    INT, 

    XYZ    array<STRUCT<X:DOUBLE, Y:DOUBLE, Z:DOUBLE>> 

) 
ROW FORMAT DELIMITED 

FIELDS TERMINATED BY ',' 

COLLECTION ITEMS TERMINATED BY '#' 

MAP KEYS TERMINATED BY ';' 

LINES TERMINATED BY '\n' 

STORED AS 

INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 

OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 

Sortie:

select * from Hivetable 


1 [{"X":1,"Y":2,"Z":3},{"X":4,"Y":5,"Z":6},{"X":7,"Y":8,"Z":9}]