【问题标题】:Hive: How to create multiple tables from multiple files or count entries per fileHive:如何从多个文件创建多个表或计算每个文件的条目
【发布时间】:2021-03-09 23:29:19
【问题描述】:

我的目标是将多个文件中的条目合并到一张表中,但在到达那里时遇到了一些麻烦。

所以我知道您可以通过以下方式将所有条目添加到表中:

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

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

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

【问题讨论】:

    标签: hive hiveql


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答。不幸的是,这是我想避免的,因为我并不总是知道文件夹中有哪些文件,所以我无法创建一定数量的表或知道它们的直接路径。我只是希望能够在给定目录中循环排序,并为其中的每个文件创建一个表。如果这是有道理的。
    • 您可以编写一个简单的 shell 脚本来自动化这个流程。该脚本将采用一个参数 - 包含团队文件的目录。它将生成一个文件列表,并且对于每个文件:(1) 创建一个 HDFS 目录 (2) 在 HDFS 目录中加载文件 (3) 创建团队 Hive 表 (4) 填充团队表。
    • shell 脚本自动处理目录中文件的方法是否适合您的情况@deeformvp?
    猜你喜欢
    • 2014-04-19
    • 2023-03-16
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多