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

Rom*_*Die 7 hadoop hive hdfs cloudera hortonworks-data-platform

我创建了两个表:

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

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

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;  
Run Code Online (Sandbox Code Playgroud)

负载数据代码如下:

load data local inpath '/home/cloudera/Desktop/SampleData.txt' into table employee;  
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*o99 8

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

请按以下步骤操作:

  1. 创建一个数据库

    CREATE DATABASE IF NOT EXISTS testdb LOCATION '/hivedb/testdb';
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个聚簇表(bucketed table)

    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';
    
    Run Code Online (Sandbox Code Playgroud)
  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';
    
    Run Code Online (Sandbox Code Playgroud)
  4. 按照@lake在上一个答案中的建议执行分组

    set hive.enforce.bucketing = true;
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  6. 将数据文件复制到HDFS位置'/ hivedb/testdb/employee_plain_table'

    ./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
    
    Run Code Online (Sandbox Code Playgroud)
  7. 在testdb.Employee_plain_table上运行select*命令

    select * from testdb.Employee_plain_table;
    
    Run Code Online (Sandbox Code Playgroud)

    这应该显示20条记录.

  8. 使用insert命令

    insert overwrite table testdb.employee select * from employee_plain_table;
    
    Run Code Online (Sandbox Code Playgroud)

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

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

  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
    
    Run Code Online (Sandbox Code Playgroud)

打开每个文件,与原始数据文件进行比较,您就会知道发生了什么.

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

更新:您使用"本地"加载,它只是一个复制操作,即它将给定的输入文件从源位置复制到目标位置.来自"local"的加载命令是副本,而来自"hdfs"的加载命令是移动操作.没有涉及mapreduce,所以没有发生任何争吵.