J'ai créé une table de ruche en suivant la commande et le schéma avro que j'avais.

CREATE TABLE table_name
PARTITIONED BY (t string, y string, m string, d string, h string, hh string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema.avsc');

Maintenant, je veux vider les données que j'ai dans HDFS dans la table créée.

J'ai un emplacement HDFS, où j'ai des données dans une structure de répertoires comme t / y / m / d / h / hh / data.avro J'ai plusieurs répertoires en fonction de la partition car ce sont mes colonnes de partition.

Je veux vider toutes les données dans la table créée.

J'ai essayé d'utiliser la table externe, mais cela donne des exceptions.

4
KrunalParmar 25 janv. 2017 à 14:20

3 réponses

Meilleure réponse

Si vous suivez la convention hive dans votre dossier hdfs et créez la table hive pointant vers l'emplacement de la table, vous devez exécuter l'instruction msck repair table.

Par exemple

CREATE TABLE table_name
PARTITIONED BY (t string, y string, m string, d string, h string, hh string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES (
'avro.schema.url'='hdfs://location/schema/schema.avsc')
location "hdfs:///location/data;

Et chargez les données comme

/location/data/y=2016/m=02/d=03/h=03/hh=12/data.avro / location / data / y = 2016 / m = 02 / d = 03 / h = 03 / hh = 13 / data2.avro

De cette façon, vous pourrez charger les données avec l'instruction suivante car Hive reconnaîtra les partitions

msck repair table table_name;

Si vous ne voulez pas faire cela, vous pouvez utiliser la partition d'ajout comme

ALTER TABLE table_nameADD PARTITION (y='01',m='02',d='03',h='03',hh='12') location '/yourpath/y=2016/m=02/d=03/h=03/hh=12/'; (or any other folder)
3
hlagos 25 janv. 2017 à 13:16

La syntaxe ci-dessous sera utile.

CREATE EXTERNAL TABLE table_name
    PARTITIONED BY (part string)
    ROW FORMAT SERDE
    'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
    WITH SERDEPROPERTIES (
    'avro.schema.url'='hdfs:///path/to/avro/schema/')
    STORED AS INPUTFORMAT
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
    OUTPUTFORMAT
    'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
    LOCATION 'path/to/location'

    ALTER TABLE table_name ADD PARTITION (part='part_name') LOCATION 'location'
1
isudarsan 11 avril 2017 à 11:56

Vous pouvez monter les données avro dans la ruche en utilisant le schéma avro:

CREATE TABLE dummy_table
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
TBLPROPERTIES (
'avro.schema.url'='hdfs:///pathtoschema/schema.avsc');

Pour répondre à votre question sur le chargement des données dans dummy_table, vous pouvez le faire en:

LOAD DATA INPATH 'hdfs:///pathtoinputdata/inputdata' OVERWRITE INTO TABLE dummy_table;
1
Neha Kumari 29 mars 2019 à 08:17