代码之家  ›  专栏  ›  技术社区  ›  whatsinthename

蜂箱中分割和扣合的结构差异

  •  7
  • whatsinthename  · 技术社区  · 7 年前

    我创建了两个表:

    1) 一个用于带bucketing的分区
    2) 仅bucketing表

    我知道蜂箱中分区和bucketing的概念。但我有点困惑,因为我读过 'partition creates directory and bucketing creates files' . 我同意第一部分,因为我可以在HDFS Hive Warehouse中看到,但我无法看到 ONLY HDFS中的bucketing表,但我加载到表中的数据文件除外。那么的文件在哪里 仅限 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 回复  |  直到 7 年前
        1
  •  10
  •   Marco99    7 年前

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

    请遵循以下步骤:

    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在上一个答案中的建议,执行bucketing

      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\u plain\u表”

      ./hadoop fs -put ~/so/data.txt /hivedb/testdb/employee_plain_table
      
    7. 在testdb上运行select*命令。Employee\u plain\u表

      select * from testdb.Employee_plain_table;
      

      这应该显示20条记录。

    8. 使用insert命令

      insert overwrite table testdb.employee select * from employee_plain_table;
      

      这应该运行map reduce作业并将记录插入到Bucked

      这将创建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”加载,这只是一个复制操作,即它将给定的输入文件从源位置复制到目标位置。“local”中的Load命令是一个副本,“hdfs”中的Load命令是一个移动操作。没有涉及mapreduce,因此没有发生bucketing。

        2
  •  4
  •   hlagos    7 年前

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

    这将迫使Hive创建桶。您应该能够看到与存储桶数量相等的文件数量(如果您有足够的记录和集群列的适当分布)。

    使现代化Load命令不创建任何存储桶,它只是将数据放入HDFS。您应该将数据加载到另一个表中,并使用insert overwrite语句将数据从一个表插入到另一个表中。