gpt4 book ai didi

hadoop - Hive中分区和分桶的结构区别

转载 作者:可可西里 更新时间:2023-11-01 14:14:31 27 4
gpt4 key购买 nike

我创建了两个表:

1) 一个用分桶进行分区
2)只有分桶表

我知道 Hive 中分区和分桶的概念。但我有点困惑,因为我读过 'partition creates directory and bucketing creates files'。我同意第一部分,因为我可以在 HDFS Hive Warehouse 中看到它,但我无法在 HDFS 中看到 ONLY 分桶表的任何文件,除了我加载到表中的数据文件。那么 ONLY 分桶表的文件在哪里呢?我能够在分区目录下看到的文件是不是像 eg: 00000_0 这样的文件,但是这个文件可以用于分区表,但是另一个分桶表呢??
下面是我创建表格的代码:

CREATE TABLE Employee(
ID BIGINT,
NAME STRING,
SALARY BIGINT,
COUNTRY STRING
)
CLUSTERED BY(ID) INTO 5 BUCKETS
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

加载数据的代码如下:

load data local inpath '/home/cloudera/Desktop/SampleData.txt' into table employee;  

我读到在创建表时会创建存储桶。如果我遗漏了什么或出了什么问题,请纠正我。有人帮忙吗?

最佳答案

我创建了配置单元外部表(这通常是我的选择)。你可以坚持你的。

请按照以下步骤操作:

  1. 创建数据库

    CREATE DATABASE IF NOT EXISTS testdb LOCATION '/hivedb/testdb';
  2. 创建聚簇表(分桶表)

    CREATE TABLE testdb.Employee(
    ID BIGINT,
    NAME STRING,
    SALARY BIGINT,
    COUNTRY STRING
    )
    CLUSTERED BY(ID) INTO 5 BUCKETS
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    STORED AS TEXTFILE
    LOCATION '/hivedb/testdb/employee';
  3. 创建一个普通表

    CREATE TABLE testdb.Employee_plain_table(
    ID BIGINT,
    NAME STRING,
    SALARY BIGINT,
    COUNTRY STRING
    )
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    STORED AS TEXTFILE
    LOCATION '/hivedb/testdb/employee_plain_table';
  4. 按照@lake 在上一个回答中的建议,强制分桶

    set hive.enforce.bucketing = true;
  5. 创建一个数据文件('data.txt')。我用 20 创建了一个数据文件记录。

    1,AAAAA,1000.00,USA
    2,BBBBB,2000.00,CANADA
    3,CCCCC,3000.00,MEXICO
    4,DDDDD,4000.00,BRAZIL
    5,EEEEE,5000.00,ARGENTINA
    6,DDDDD,6000.00,CHILE
    7,FFFFF,7000.00,BOLIVIA
    8,GGGGG,8000.00,VENEZUELA
    9,HHHHH,9000.00,PERU
    10,IIIII,10000.00,COLOMBIA
    11,JJJJJ,11000.00,EQUADOR
    12,KKKKK,12000.00,URUGUAY
    13,LLLLL,13000.00,PARAGUAY
    14,MMMMM,14000.00,GUYANA
    15,NNNNN,15000.00,NICARAGUA
    16,OOOOO,16000.00,PANAMA
    17,PPPPP,17000.00,COSTA RICA
    18,QQQQQ,18000.00,HAITI
    19,RRRRR,19000.00,DOMINICA
    20,SSSSS,20000.00,JAMAICA
  6. 将数据文件复制到 HDFS 位置'/hivedb/testdb/employee_plain_table'

    ./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
  7. 在 testdb.Employee_plain_table 上运行 select * 命令

    select * from testdb.Employee_plain_table;

    这应该显示 20 条记录。

  8. 使用插入命令

    insert overwrite table testdb.employee select * from employee_plain_table;

    这应该运行一个 map reduce 作业并将记录插入 bucketed表。

    这将创建 5 个文件,因为根据 DDL 我们有 5 个桶员工表。

  9. 使用命令验证:

    ./hadoop fs -ls /hivedb/testdb/employee
    Found 5 items
    -rwxr-xr-x 1 hduser supergroup 95 2017-10-19 11:04 /hivedb/testdb/employee/000000_0
    -rwxr-xr-x 1 hduser supergroup 81 2017-10-19 11:04 /hivedb/testdb/employee/000001_0
    -rwxr-xr-x 1 hduser supergroup 90 2017-10-19 11:05 /hivedb/testdb/employee/000002_0
    -rwxr-xr-x 1 hduser supergroup 88 2017-10-19 11:05 /hivedb/testdb/employee/000003_0
    -rwxr-xr-x 1 hduser supergroup 84 2017-10-19 11:05 /hivedb/testdb/employee/000004_0

打开每个文件,与原始数据文件进行比较,你会 了解发生了什么。

希望这能澄清您的疑问!引用:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL+BucketedTables

更新:您将加载与“本地”一起使用,它只是一个复制操作,即将给定的输入文件从源位置复制到目标位置。来自“local”的加载命令是一个副本,来自“hdfs”的是一个移动操作。不涉及 mapreduce,因此不会发生分桶。

关于hadoop - Hive中分区和分桶的结构区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46644493/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com