2017-04-17 1 views
0

J'ai plusieurs sous-répertoires dans S3 qui contiennent des fichiers .orc. J'essaye de créer un métastore de ruche afin que je puisse interroger les données avec Presto/Hive, etc. Les données sont mal structurées (aucun délimiteur consistant, caractères moche, etc.). Voici un exemple frotté:Comment ajouter des données à un métastore de ruche existant?

1488736466 199.199.199.199 0_b.www.sphericalcow.com.f9b1.qk-g6m6z24tdr.v4.url.name.com TXT IN: NXDOMAIN/0/143 
1488736466 6.6.5.4 0.3399.186472.4306.6668.638.cb5a.names-things.update.url.name.com TXT IN: NOERROR/3/306 0\009253\009http://az.blargi.ng/%D3%AB%EF%BF%BD%EF%BF%BD/\009 0\009253\009http://casinoroyal.online/\009 0\009253\009http://d2njbfxlilvpsq.cloudfront.net/b_zq_ym_bangvideo/bangvideo0826.apk\009 

j'ai pu créer un pointage de table à l'un des sous-répertoires en utilisant une expression régulière de serde et les champs sont l'analyse syntaxique correctement, mais pour autant que je peux dire que je ne peux charger un sous-dossier à une fois.

Comment ajouter d'autres données à un métastore de ruche existant?

Voici un exemple de ma ruche MetaStore create avec le bit regex serde:

DROP TABLE IF EXISTS test; 

CREATE EXTERNAL TABLE test (field1 string, field2 string, field3 string, field4 string) 
COMMENT 'fill all the tables with the datas.' 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
    WITH SERDEPROPERTIES (
"input.regex" = "([0-9]{10}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) (\\S*) (.*)", 
"output.format.string" = "%1$s %2$s %3$s %4$s" 
) 
STORED AS ORC 
LOCATION 's3://path/to/one/of/10/folders/' 
tblproperties ("orc.compress" = "SNAPPY", "skip.header.line.count"="2"); 

select * from test limit 10; 

Je me rends compte qu'il ya probablement une solution très simple, mais j'ai essayé INSERT INTO en place de CREATE TABLE EXTERNE, mais se plaint de la saisie, et j'ai cherché de l'aide dans la documentation de la ruche et de la serde, mais je n'ai pas pu trouver de référence à l'ajout à un magasin existant.

+1

Wow. (1) Vous ne "chargez" rien. Une table externe est une interface contenant des instructions pour la lecture de données et éventuellement l'écriture. (2) Le métastore contient la définition de la table, pas les données. (3) Je doute sérieusement que vous interrogez des fichiers ORC en utilisant RegexSerDe. De plus, il n'y a pas d'indication pour ORC dans la définition de la table externe. (4) "output.format.string" est obsolète –

+0

Il existe 2 solutions possibles. Ajoutez la structure des dossiers pour voir ce qui est pertinent. P.s. Ajouter un échantillon de données - Il y a une chance que RegexSerDe soit une surcharge ici. –

+0

Merci, @DuduMarkovitz. 1) Mauvais choix de mots; Je devrais savoir mieux. Édité. 2) voir (1). 3) les fichiers bruts sont .orc, mais je pense qu'il me manque une ligne 'stored as orc'. Fixé maintenant 4) Je ne le savais pas - merci. Je vais ajouter un échantillon de données. Il n'y a pas de délimiteur, donc regex est nécessaire - des données moche. Vous pouvez probablement le dire, mais je suis nouveau dans l'écosystème Hadoop, alors j'apprécie l'aide. – TheProletariat

Répondre

0

Solution possible à l'aide de partitions.

CREATE EXTERNAL TABLE test (field1 string, field2 string, field3 string, field4 string) 
partitioned by (mypartcol string) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
    WITH SERDEPROPERTIES (
"input.regex" = "([0-9]{10}) ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) (\\S*) (.*)" 
) 
LOCATION 's3://whatever/as/long/as/it/is/empty' 
tblproperties ("skip.header.line.count"="2"); 

alter table test add partition (mypartcol='folder 1') location 's3://path/to/1st/of/10/folders/'; 
alter table test add partition (mypartcol='folder 2') location 's3://path/to/2nd/of/10/folders/'; 
. 
. 
. 
alter table test add partition (mypartcol='folder 10') location 's3://path/to/10th/of/10/folders/'; 
0

Pour @TheProletariat (OP)

Il semble qu'il n'y ait pas besoin de RegexSerDe puisque les colonnes sont délimitées par l'espace (» «).
Notez l'utilisation de tblproperties ("serialization.last.column.takes.rest"="true")

create external table test 
(
    field1 bigint 
    ,field2 string 
    ,field3 string 
    ,field4 string 
) 
row format delimited 
fields terminated by ' ' 
tblproperties ("serialization.last.column.takes.rest"="true") 
; 
+0

Ils ne sont pas délimités par l'espace. Ce sont des enregistrements DNS qui peuvent prendre de nombreux formats différents, dont certains ont plusieurs espaces, et certains n'en ont pas, comme ceci: TXT IN: NXDOMAIN/0/148 TXT IN: NOERROR/1/124 10090_10203 \ 009sphericalcow. com \ 009 etc. – TheProletariat