Hive 配置单元:如何从多个文件中创建多个表或对每个文件的条目进行计数

Hive 配置单元:如何从多个文件中创建多个表或对每个文件的条目进行计数,hive,hiveql,Hive,Hiveql,我的目标是将多个文件中的条目合并到一个表中,但我在这方面遇到了一些困难 因此,我理解您可以通过以下操作将所有条目添加到表中: CREATE EXTERNAL TABLE tablename ( teams STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' LOCATION 'hdfs:///hive-data'; 其中每个文本文件的数据如下所示: student#A18645

我的目标是将多个文件中的条目合并到一个表中,但我在这方面遇到了一些困难

因此,我理解您可以通过以下操作将所有条目添加到表中:

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
或者更确切地说,是一种将每个条目编号为它来自的文件行号的方法,这样我就可以在表上进行内部联接


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

您可以使用这种方法来构建最终的表

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

-- 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
在配置单元中创建两个表,每个团队一个表

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';
在配置单元中创建最终表格以保存组合数据

CREATE TABLE teams
(
    team_number INT,
    students STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';
填充最终表格 (因为逗号是字段分隔符,所以冒号用于生成学生列表的字符串)

验证最终表格

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

谢谢你的回答。不幸的是,这正是我想要避免的,因为我并不总是知道文件夹中有哪些文件,所以我无法创建一组表或知道它们的直接路径。我只希望能够对给定目录进行循环排序,并为其中的每个文件创建一个表。如果这有意义的话,您可以编写一个简单的shell脚本来自动化这个流程。脚本将采用一个参数—包含团队文件的目录。它将生成一个文件列表,并为每个文件:(1)创建一个HDFS目录(2)在HDFS目录中加载文件(3)创建团队配置单元表(4)填充团队表。shell脚本自动处理目录中文件的方法是否适用于您的情况@deeformvp?
SELECT * FROM teams;
teams.team_number   teams.students
1                   student#A18645:student#V86541:student#X78543
2                   student#P20045:student#Q30041:student#R40043