Hive: Как создать несколько таблиц из нескольких файлов или подсчитать записи на файл - PullRequest
0 голосов
/ 01 мая 2018

Моя цель - объединить записи из нескольких файлов в 1 таблицу, но у меня возникли некоторые проблемы при их получении.

Итак, я понимаю, что вы можете добавить все записи в таблицу, выполнив:

CREATE EXTERNAL TABLE tablename
(
    teams STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 'hdfs:///hive-data';

Где данные каждого текстового файла выглядят примерно так:

student#A18645
student#V86541
student#X78543

Однако, с кодом выше, это объединяет все данные из N файлов в моем каталоге, что затрудняет объединение данных. Я хочу, чтобы первые записи из всех файлов были объединены в одну строку и введены в новую таблицу и так далее. Я попытался нумеровать каждую запись с помощью ROW_NUMBER (), но это не дает номер их места в файле, а скорее в самой таблице.

Следовательно, есть ли способ создать таблицу для каждого файла, пронумеровать записи и объединить все таблицы вместе, чтобы в итоге я мог получить таблицу, которая выглядит следующим образом:

number           students
1                student#A18645,student#D94655,...student#S45892
2                student#V86541,student#D45645,...student#F46444
3                student#X78543,student#T78722,...student#M99846

Вернее, способ нумерации каждой записи в качестве номера строки файла, из которого она получена, чтобы я мог выполнить внутреннее соединение в своей таблице.

Примечание: количество файлов может варьироваться, поэтому у меня нет заданного количества файлов для циклического перебора

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать этот подход для построения финального стола.

Допустим, это два файла для двух команд.

-- team1.txt
student#A18645
student#V86541
student#X78543

-- team2.txt
student#P20045
student#Q30041
student#R40043

Загрузить их в HDFS, каждый файл в отдельный каталог

hadoop fs -mkdir /hive-data/team1
hadoop fs -mkdir /hive-data/team2
hadoop fs -put team1.txt /hive-data/team1
hadoop fs -put team2.txt /hive-data/team2

Создайте две таблицы в Hive, по одной для каждой команды

CREATE EXTERNAL TABLE team1
(
    teams STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 'hdfs:////hive-data/team1';

CREATE EXTERNAL TABLE team2
(
    teams STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 'hdfs:////hive-data/team2';

Создание итоговой таблицы в Hive для хранения комбинированных данных

CREATE TABLE teams
(
    team_number INT,
    students STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

Заполните финальный стол (Так как запятая является разделителем полей, для создания строки списка студентов используется двоеточие)

INSERT INTO teams (team_number, students)
SELECT 1, CONCAT_WS(":", COLLECT_LIST(teams)) FROM team1;

INSERT INTO teams (team_number, students)
SELECT 2, CONCAT_WS(":", COLLECT_LIST(teams)) FROM team2;

Проверка финального стола

SELECT * FROM teams;
teams.team_number   teams.students
1                   student#A18645:student#V86541:student#X78543
2                   student#P20045:student#Q30041:student#R40043
...