我的目标是将来自多个文件的条目合并到一个表格中,但在到达目的地时遇到了一些麻烦。
所以我知道您可以通过执行以下操作将所有条目添加到表中:
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
或者更确切地说,是一种将每个条目编号为它所来自的文件的行号的方法,这样我就可以在我的桌子上进行内部联接。
注意:文件数量可能会有所不同,因此我没有一定数量的文件要循环
答案 0 :(得分:0)
您可以使用此方法构建最终表格。
让我们说这是两个团队的两个文件。
-- 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