一篇文章带你了解hive内表与外表

了解hive内表与外表并应用

1、内外表基础介绍

Hive是建立在Hadoop之上的数据仓库工具,它提供了类似于SQL的查询语言(HiveQL),可以方便地进行数据分析和处理。在Hive中,你可以创建内部表(Internal Table)和外部表(External Table)来管理数据。下面是内部表和外部表的介绍和区别:

内部表(Internal Table):

  • 内部表是Hive的一种表类型,它在创建时会在Hive的数据仓库中创建一个表,并将数据存储在Hive管理的位置。
  • 内部表的数据是由Hive自动管理的,当你删除内部表时,Hive也会删除与之关联的数据。
  • 内部表的数据存储位置由Hive定义,并且通常位于HDFS中的指定目录。
  • 内部表适用于需要Hive来管理和维护数据的情况。

外部表(External Table):

  • 外部表也是Hive的一种表类型,它在创建时会在Hive的数据仓库中创建一个表,但数据并不存储在Hive管理的位置。
  • 外部表只是在指定位置建立了对数据的指针,实际数据仍保留在外部存储系统(如HDFS或S3)中。
  • 当你删除外部表时,外部存储系统中的数据不会被删除。
  • 外部表适用于希望在Hive中访问外部数据,但不需要直接管理数据的情况。

下面是创建内部表和外部表的示例:

创建内部表:

CREATE TABLE table_name (
  column1 data_type,
  column2 data_type,
  ...
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/path/to/table';

其中,table_name是你要创建的内部表名,column1column2等是表的列名和数据类型,LOCATION指定了表的存储位置。

创建外部表:

CREATE EXTERNAL TABLE table_name (
  column1 data_type,
  column2 data_type,
  ...
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/path/to/external_data';

在上述语法中,table_name是你要创建的外部表名,column1column2等是表的列名和数据类型,LOCATION指定了外部数据的存储位置。

请根据你的需求选择适合的表类型(内部表或外部表)来管理数据。

2、内部表或外部表分别适合使用哪些场景?

内部表适合的场景:

  1. 数据仓库和数据湖:当你想要在Hive中创建和管理完整的数据仓库或数据湖时,内部表是一个不错的选择。你可以使用Hive来管理数据的生命周期,包括数据的删除、清理和维护。
  2. 数据集成和转换:如果你需要在Hive中进行数据集成和转换操作,内部表提供了方便的方式来操作和处理数据。你可以使用HiveQL执行复杂的查询和转换操作,将数据转化为所需的格式。
  3. 数据分析和报表:当你需要对数据进行分析和生成报表时,内部表是一个很好的选择。你可以利用Hive的查询语言和内置函数来处理数据,并通过Hive的结果集生成报表。

外部表适合的场景:

  1. 数据外部存储:如果你的数据已经存在于外部存储系统(如HDFS、S3或其他数据库)中,而且你只需要在Hive中对数据进行查询和分析,而不需要直接管理数据,那么外部表是一个理想的选择。外部表允许你在Hive中访问外部数据,而无需将数据复制到Hive的数据仓库中。
  2. 数据共享和集成:外部表可以作为不同团队或部门之间共享数据的中介。多个团队可以在Hive中创建外部表来访问共享的数据,而无需复制或移动数据。这样可以实现数据的统一和一致性。
  3. 原始数据保留:如果你需要保留原始数据,并且希望在Hive中进行查询和分析,外部表是一个合适的选择。你可以在外部存储系统中保留数据的原始副本,以便以后进行其他分析或操作,而不会受到Hive数据管理的限制。

综上所述,内部表适合需要Hive管理数据生命周期和数据仓库功能的场景,而外部表适合已经存在于外部存储系统中的数据,或需要在多个团队之间共享数据的场景。选择适当的表类型可以根据你的数据管理需求和工作流程来决定。

3、应用- 以Excel文档导入数据到hive为例

3.1、创建内部表,并导入数据

  通过Excel文件上传数据到Hive,你可以创建内部表或外部表。如果你选择创建内部表(Internal Table),Hive将会在指定的数据库中创建一个新表,并将Excel文件的数据加载到Hive的数据仓库中。内部表的特点是,当你删除该表时,Hive也会自动删除与之关联的数据。

  要将Excel文件的数据加载到Hive的数据仓库中,可以按照以下步骤进行操作:

  1、将Excel文件转换为适合Hive导入的格式,如CSV或TSV。可以使用Excel软件将文件另存为CSV或TSV格式,确保字段之间使用适当的分隔符。

        2、将转换后的CSV或TSV文件上传到Hadoop分布式文件系统(HDFS)中的某个位置,例如 /path/to/csv_file.csv1

  3、使用Hive的LOAD DATA INPATH语句将数据加载到内部表中。假设你已经在Hive中创建了一个内部表,可以按照以下步骤加载数据,其中,table_name是你要加载数据的内部表的名称。

LOAD DATA INPATH '/path/to/csv_file.csv' INTO TABLE table_name;

 4、如果CSV或TSV文件中包含表头(即第一行是列名),可以在加载数据时指定HEADER选项,告诉Hive跳过第一行。

LOAD DATA INPATH '/path/to/csv_file.csv' INTO TABLE table_name OPTIONS ('HEADER'='true');

      5、执行上述LOAD DATA语句后,Hive将读取CSV或TSV文件的内容,并将数据加载到指定的内部表中。你现在可以查询该表并进行其他操作了。

3.2、创建外部表,并导入数据

如果你选择创建外部表(External Table),Hive将会在指定的数据库中创建一个新表,但数据不会被复制到Hive的数据仓库中。相反,外部表只是在指定位置建立了对Excel文件的指针。当你删除外部表时,Excel文件的数据不会被删除。

要将Excel文件的数据加载到Hive的数据仓库中,你可以按照以下步骤进行操作:

  1. 将Excel文件转换为适合Hive导入的格式,如CSV或TSV。可以使用Excel软件将文件另存为CSV或TSV格式,确保字段之间使用适当的分隔符。

  2. 将转换后的CSV或TSV文件上传到Hadoop分布式文件系统(HDFS)中的某个位置,例如 /path/to/csv_file.csv。 

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.io.File;
import java.io.IOException;

public class CsvUploader {

    public static void main(String[] args) {
        String localFilePath = "path/to/local/csv_file.csv";
        String hdfsFilePath = "/path/to/csv_file.csv";

        Configuration config = new Configuration();
        config.set("fs.defaultFS", "hdfs://localhost:9000"); // 设置HDFS的地址

        try {
            FileSystem hdfs = FileSystem.get(config);
            Path localPath = new Path(localFilePath);
            Path hdfsPath = new Path(hdfsFilePath);

            // 检查本地文件是否存在
            File localFile = new File(localFilePath);
            if (!localFile.exists()) {
                System.out.println("Local file does not exist.");
                return;
            }

            // 上传本地文件到HDFS
            hdfs.copyFromLocalFile(localPath, hdfsPath);

            System.out.println("CSV file uploaded to HDFS successfully.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 创建一个外部表,并指定外部表的列名和数据类型,以及文件的存储位置。例如:

CREATE EXTERNAL TABLE table_name (
column1 data_type,
column2 data_type,
...
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/path/to/csv_file.csv';

在上述示例中,table_name是你要创建的外部表的名称,column1column2等是表的列名和数据类型,FIELDS TERMINATED BY ','指定了字段的分隔符为逗号,LOCATION指定了CSV文件的存储位置。

  1. 执行上述CREATE EXTERNAL TABLE语句后,Hive会在指定的位置建立对CSV文件的指针,并在Hive的数据仓库中创建一个外部表。

  2. 现在,你可以查询这个外部表并进行其他操作了。例如,可以使用SELECT语句查询表的内容:

SELECT * FROM table_name;

请注意,外部表只是在指定位置建立了对数据的指针,并没有将数据复制到Hive的数据仓库中。因此,如果你更改了CSV文件的内容或位置,外部表的查询结果也会相应地反映这些更改。

确保在执行上述操作之前,你已经正确安装和配置了Hadoop和Hive,并且具有适当的权限来访问HDFS和执行Hive命令。

 

posted @ 2023-05-24 18:58  LUDAGOGO  阅读(4512)  评论(0)    收藏  举报