Hive 表中的分区和聚类方式是如何工作的?

如何解决Hive 表中的分区和聚类方式是如何工作的?

我试图通过使用数据将如何放置来理解以下查询

CREATE TABLE mytable ( 
         name string,city string,employee_id int ) 
PARTITIONED BY (year STRING,month STRING,day STRING) 
CLUSTERED BY (employee_id) INTO 256 BUCKETS

关键字PARTITIONED BY将数据分布在下面的目录结构中。

/user/hive/warehouse/mytable/y=2015/m=12/d=02

但我无法理解,employee_id 将如何分布在这些目录中?将创建 256 个存储桶(文件),所有这些文件都将包含 employee_id 但哪个文件将位于哪个目录下,如何决定?

谁能帮我理解这个?

解决方法

目录是分区或表位置。存储桶是这些目录中的文件。

复杂分区是分层目录。在你的情况下:

`/user/hive/warehouse/mytable/` - Table location,contains partition directories:
  `y=2015/` - year partition directory,contains months directories: 
    `m=12/` - month partition,contains days partitions directories:
      `d=02/` - day partition,contains 256 files(buckets)
        00000
        ...
        00255
     `d=03/` -Each day partition will contain 256 files (if you have enough data)
        00000
        ...
        00255     

每个文件都不会包含所有的employee_id。使用以下公式确定哪个记录将位于哪个文件中:

 bucket_number=hash_function(employee_id) MOD 256 

其中 hash_function 是整数,在 Int employee_id 的情况下,它等于 employee_id。

256 - 是桶数

MOD 256 将生成范围 [0..255] 内的整数值,对应于桶号。

相同的 ID 将始终位于相同的存储桶中。每个日常分区将包含它自己的文件(桶),每个分区最多 256 个桶。

比如说,employee_id = 1024 进入bucket 0,如果同一个employee_id存在很多天,它会在每天目录的00000文件中。

employee_id=1050 进入文件 000026,因为 1050 MOD 256 = 26

因此,首先将数据按分区键进行分区,在分区内将数据分桶(分布在文件之间)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?