首页 文章

蜂巢中分区和分区的结构差异

提问于
浏览
7

我创建了两个表:

1)一个用于分区的分区
2)只有 table

我知道hive中分区和分区的概念 . 但我有点困惑因为我读过 'partition creates directory and bucketing creates files' . 我同意第一部分,因为我可以在HDFS Hive Warehouse中看到,但我无法在HDFS中看到 ONLY bucketing表的任何文件,除了我加载到表中的数据文件 . 那么 ONLY bucketing表的文件在哪里?我能够在分区目录下看到的文件是 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;

我已经读过,当我们创建表时会创建存储桶 . 如果我遗漏了某些内容或出错了,请更正我 . 有人请帮忙吗?

2 回答

  • 4

    我创建了hive外部表(通常是我的选择) . 你可以坚持下去 .

    请按以下步骤操作:

    • 创建数据库
    CREATE DATABASE IF NOT EXISTS testdb LOCATION '/hivedb/testdb';
    
    • 创建聚簇表(分块表)
    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';
    
    • 创建一个普通表
    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';
    
    • 按照@lake在上一个答案中的建议执行分组
    set hive.enforce.bucketing = true;
    
    • 创建数据文件('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
    
    • 将数据文件复制到HDFS位置'/ hivedb / testdb / employee_plain_table'
    ./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
    
    • 在testdb.Employee_plain_table上运行select *命令
    select * from testdb.Employee_plain_table;
    

    这应该显示20条记录 .

    • 使用insert命令
    insert overwrite table testdb.employee select * from employee_plain_table;
    

    这应该运行map reduce作业并将记录插入到bucketed表中 .

    这将创建5个文件,因为我们有5个桶,根据employee表的DDL .

    • 使用命令验证:
    ./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,所以没有发生任何争吵 .

  • 6

    这是因为您必须在插入到bucketed表期间强制执行bucketing或为自己创建存储桶 . 如果要将数据插入存储桶表,则可以使用以下标志 .

    set hive.enforce.bucketing = true;  -- (Note: Not needed in Hive 2.x onward)
    

    这将迫使Hive创建桶 . 您应该能够看到许多文件等于您的桶数(如果您有足够的记录和正确的聚类列分布) .

    更新 . 加载命令不会创建任何桶,它只是将数据放入HDFS . 您应该将数据加载到另一个表中,并使用insert overwrite语句将数据从一个表插入另一个表 .

相关问题