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

时间:2017-10-09 10:39:40

标签: hadoop hive hdfs cloudera hortonworks-data-platform

我创建了两个表:

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

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

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

2 个答案:

答案 0 :(得分:8)

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

请按以下步骤操作:

  1. 创建数据库

    private async Task YourAsyncMethod(NavigationMenuItem newNavigationMenu)
    {
        //call async tasks...
    }
    
  2. 创建群集表(分块表)

    CREATE DATABASE IF NOT EXISTS testdb LOCATION '/hivedb/testdb';
    
  3. 创建普通表

    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';
    
  4. 按照@lake在上一个回答

    中的建议执行分组
    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';
    
  5. 创建数据文件(' data.txt')。我用20创建了一个数据文件 记录。

    set hive.enforce.bucketing = true;
    
  6. 将数据文件复制到HDFS位置 ' / hivedb / TESTDB / employee_plain_table'

    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
    
  7. 在testdb.Employee_plain_table

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

    这应显示20条记录。

  8. 使用插入命令

    select * from testdb.Employee_plain_table;
    

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

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

  9. 使用以下命令验证:

    insert overwrite table testdb.employee select * from employee_plain_table;
    
  10. 打开每个文件,与原始数据文件进行比较,然后你就可以了     了解发生了什么。

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

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

答案 1 :(得分:4)

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

target = "http://www.abs.gov.au/ausstats/meisubs.NSF/log?openagent&5206001_key_aggregates.xls&5206.0&Time%20Series%20Spreadsheet&24FF946FB10A10CDCA258192001DAC4B&0&Jun%202017&06.09.2017&Latest"
dest = 'downloaded_file.xlsx'

download.file(url = target, destfile = dest)

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

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