【问题标题】:partition column in hive蜂巢中的分区列
【发布时间】:2018-02-12 21:17:57
【问题描述】:

我必须在hive 中使用一个列对表进行分区,该列也是表的一部分。

例如:

表:员工

列:employeeId、employeeName、employeeSalary

我必须使用employeeSalary 对表进行分区。 所以我写了以下查询:

 CREATE TABLE employee (employeeId INT, employeeName STRING, employeeSalary INT) PARTITIONED BY (ds INT); 

我在这里只使用了名称“ds”,因为它不允许我使用相同的名称employeeSalary

我这样做对吗?此外,在向表中插入值时,我必须使用逗号分隔的文件。现在该文件由如下行组成: 2019,约翰,2000

作为一排。 如果我必须使用薪水进行分区,我的第一个分区将是薪水 2000 的所有人。所以查询将是

LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (ds=2000);

在 100 条工资为 2000 的条目之后,我有接下来的 500 条工资为 4000 的条目。 所以我会再次触发查询:

LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (ds=4000);

如果我是对的,请告诉我...

【问题讨论】:

    标签: hive


    【解决方案1】:

    以下是如何在您指定的列上创建具有分区的配置单元表

    CREATE TABLE employee (employeeId INT, employeeName STRING) PARTITIONED BY (employeeSalary INT);
    

    分区列在PARTITIONED BY 部分中指定。
    在 Hive shell 中,您可以运行describe employee;,它将显示表中的所有列。使用您的CREATE TABLE,您应该会看到 4 列,而不是您想要获得的 3 列。

    对于您的加载命令,您需要指定要写入的所有分区。 (我对这些不是很熟悉,主要是基于http://wiki.apache.org/hadoop/Hive/LanguageManual/DML#Syntax

    类似

    LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (employeeSalary=2000, employeeSalary=4000);
    

    【讨论】:

    • 您好,感谢您的回复。所以你的意思是说在上传文件中只有两个值employeeId和employeeName?
    • 另外,对于employeeSalary,我必须在单独的查询中指定这两个值,例如: LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (employeeSalary= 2000); LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE employee PARTITION (employeeSalary=4000);
    • 表格中有 3 列,您的文件每行应该有 3 个条目。 employeeSalary 是一列。我相信您应该使用单个查询,使用两个可能会产生相同的结果...我还没有将数据加载到足以知道的多个分区中。
    【解决方案2】:

    hive 中的分区表是这样工作的: 1)分区列数据/值不存储在仓库中的实际数据文件中,而是存储在hive元存储中。

    2) 所以hive仓库目录下的数据文件中不应该有分区列数据。

    对于您的问题,这些应该是步骤。

    1)

    CREATE TABLE employee (employeeId INT, employeeName STRING ) PARTITIONED BY (employeeSalary INT) stored as <your choice of format>;

    这将在配置单元元存储中创建一个条目,您创建了一个包含 2 列employeeId INT、employeeName STRING 的表,并且它有一个分区列employeeSalary INT。

    2) 创建一个临时表,比如说 emp_temp。

    CREATE TABLE emp_temp (employeeId INT, employeeName STRING,employeeSalary INT ) stored as text; 
    

    我假设您的输入文件是文本格式。

    3) 将所有文件复制到 emp_temp 表的仓库位置或运行以下查询(我假设您在 ./example/files 文件夹中拥有所有数据文件。)

    LOAD DATA LOCAL INPATH './examples/files/*.txt' OVERWRITE INTO TABLE emp_temp.

    4) 现在运行以下 hql(这将为您动态创建分区)

     INSERT OVERWRITE TABLE employee partition(employeeSalary) 
       SELECT employeeId , employeeName , employeeSalary 
       from emp_temp
    

    谢谢, 阿地亚

    【讨论】:

      【解决方案3】:

      也许,我认为,您应该首先将所有数据加载到一个表中,然后使用 Hive 扩展(多次插入):

      FROM from_statement
      INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...) [IF NOT          EXISTS]] select_statement1
      [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] 
      [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] ...;
      FROM from_statement
      INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1
      [INSERT INTO TABLE tablename2 [PARTITION ...] select_statement2] 
      [INSERT OVERWRITE TABLE tablename2 [PARTITION ... [IF NOT EXISTS]] select_statement2] ...;
      

      然后,如果你愿意,你可以

      from big_data_table
      insert overwrite table table1 partiton (ds=2000)
      select * where employeeId>0 && employeeId<101>
      insert overwrite table table2 partition (ds=4000)
      select * where employeeId>=101&&employeeId<=600
      

      【讨论】:

        猜你喜欢
        • 2015-05-20
        • 1970-01-01
        • 1970-01-01
        • 2014-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-26
        • 2019-12-22
        相关资源
        最近更新 更多