当前位置: 首页 > 知识库问答 >
问题:

在Hive中分区和扣表有什么区别?

刘玉石
2023-03-14

我知道这两个操作都是对表中的一列执行的,但每个操作有什么不同。

共有1个答案

邢宏浚
2023-03-14

数据分区通常用于水平分配负载,这具有性能优势,并有助于以逻辑方式组织数据。示例:如果我们正在处理一个大型Employee表,并且经常使用WHERE子句运行查询,这些子句将结果限制在特定的国家或部门。为了更快的查询响应,配置单元表可以按(country STRING,DEPT STRING)进行分区。分区表改变了配置单元的结构数据存储和配置单元现在将创建反映分区结构的子目录,如

.../employees/country=abc/dept=xyz。

如果查询限制员工来自country=abc,则只扫描一个目录country=abc的内容。这可以显著提高查询性能,但前提是分区方案反映了公共筛选。分区特性在Hive中非常有用,然而,创建太多分区的设计可能会优化某些查询,但对其他重要查询不利。分区太多的另一个缺点是不必要地创建大量Hadoop文件和目录,以及NameNode的开销,因为它必须将文件系统的所有元数据保存在内存中。

Bucketing是将数据集分解成更易于管理的部分的另一种技术。例如,假设一个表使用date作为顶层分区,使用employee_id作为二级分区,会导致太多的小分区。相反,如果我们将employee表bucketing并使用employee_id作为bucketing列,则该列的值将通过用户定义的数字散列到buckets中。具有相同employee_id的记录将始终存储在同一个bucket中。假设employee_id的数量远大于buckets的数量,那么每个bucket将有许多employee_id。在创建表时,可以将likeclustered BY(employee_id)指定为XX桶;,其中XX是桶的数量。Bucketing有几个优点。桶的数量是固定的,所以它不会随数据而波动。如果用employee_id对两个表进行排列,Hive可以创建逻辑上正确的采样。Bucketing还有助于进行有效的地图端连接等。

 类似资料:
  • 我试图优化两个spark dataframes之间的联接查询,让我们将它们称为df1、df2(在公共列“saleid”上联接)。df1非常小(5M),所以我在spark集群的节点中广播它。df2非常大(200米行),所以我尝试通过“saleid”对它进行桶/重新分区。 例如: 分区: 水桶: 我不知道哪一个是正确的技术使用。谢谢。

  • 一、分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大。 分区为 HDFS 上表目录的子目录,数据按照分区存储在子目录中。如果查询的 where 字句的中包含分区条件,则直接从该分区去查找,而不是扫描整个表目录,合理的分区设计可以极大提高查询速度和性能。 这里说明一下分区表并 Hive 独有的概念,实际上这个概念

  • 我在这里浏览了文档:https://spark . Apache . org/docs/latest/API/python/py spark . SQL . html 它说: 重新分区:生成的DataFrame是哈希分区的 对于repartitionByRange:结果DataFrame是范围分区的 而且之前的一个问题也提到了。然而,我仍然不明白它们到底有什么不同,当选择一个而不是另一个时会有什么

  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 问题内容: 我在看一些模拟的OCJP问题。我遇到了一个非常令人困惑的语法。这里是: 为什么输出在和之间变化? 问题答案: 问题只是和您玩弄混乱的空格。 是通常的(不等于)比较。 另一方面: 最好写成如下形式: 因此,这是两个运算符。 首先反转。 然后将其分配回。 赋值运算符返回分配的值。因此,计算结果为true-这就是您要打印的内容。

  • 只需在Xpath中添加即可--它突出显示--各种页面元素----它表示什么? 下面是用于Gmail密码字段的XPaths。的意义是什么? >