hive - 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
或者更确切地说,一种将每个条目编号为它来自的文件的行号的方法,这样我就可以在我的表上进行内部连接。
注意:文件的数量可能会有所不同,因此我没有要循环的文件数量
解决方案
您可以使用这种方法来构建决赛桌。
假设这是两个团队的两个文件。
-- 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
推荐阅读
- firebase - Firebase 存储身份验证不起作用
- python - 打包带有pylucene依赖的python软件
- java - MyBatis,根据环境动态改变数据库类型
- mysql - 错误的 MYSQL 查询
- ios - iOS看门狗在杀死应用程序之前让主线程挂起多长时间?
- java - 如何在 Android Studio 中查看布局编辑器而不是 XML 代码?
- node.js - loopback 4 命令模型挂起
- javascript - 如何预加载在 JS 中调用的 css
- javascript - 有没有更好的基于 HTMLmenu 的方法来做到这一点?
- model-checking - 如何检查决策树是否满足不变量?