首页 > 解决方案 > Hive:如何从多个文件创建多个表或计算每个文件的条目

问题描述

我的目标是将来自多个文件的条目合并到 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

或者更确切地说,一种将每个条目编号为它来自的文件的行号的方法,这样我就可以在我的表上进行内部连接。

注意:文件的数量可能会有所不同,因此我没有要循环的文件数量

标签: hivehiveql

解决方案


您可以使用这种方法来构建决赛桌。

假设这是两个团队的两个文件。

-- 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

推荐阅读