Hadoop 蜂巢-装袋和分割

Hadoop 蜂巢-装袋和分割,hadoop,hive,bigdata,Hadoop,Hive,Bigdata,对于我们来说,在蜂巢中的一组列上使用分区还是扣合,应该根据什么来缩小范围 假设我们有一个巨大的数据集,其中有两列最常被查询-因此我的明显选择可能是基于这两列进行分区,但如果这会导致在大量目录中创建大量小文件,否则,基于这些列对数据进行分区将是一个错误的决定,而bucketing可能是一个更好的选择 我们是否可以定义一种方法,用它来决定我们应该使用bucketing还是partitioning?partitioning: 分区是根据某些条件分解/划分输入数据,例如:日期、国家/地区 创建表日志(t

对于我们来说,在蜂巢中的一组列上使用分区还是扣合,应该根据什么来缩小范围

假设我们有一个巨大的数据集,其中有两列最常被查询-因此我的明显选择可能是基于这两列进行分区,但如果这会导致在大量目录中创建大量小文件,否则,基于这些列对数据进行分区将是一个错误的决定,而bucketing可能是一个更好的选择

我们是否可以定义一种方法,用它来决定我们应该使用bucketing还是partitioning?

partitioning:

分区是根据某些条件分解/划分输入数据,例如:日期、国家/地区

创建表日志(ts BIGINT,行字符串) 分区依据(dt字符串、国家/地区字符串)

将数据本地加载到路径“input/hive/partitions/file1” 进入表日志分区(dt='2012-01-01',country='GB')

加载数据后在仓库中创建的文件如下:

/用户/hive/warehouse/logs/dt=2012-01-01/country=GB/file1/

/用户/hive/warehouse/logs/dt=2012-01-01/country=GB/file2/

/用户/hive/warehouse/logs/dt=2012-01-01/country=US/file3/

/用户/hive/warehouse/logs/dt=2012-01-02/country=GB/file4/

/用户/hive/warehouse/logs/dt=2012-01-02/country=US/file5/

/用户/hive/warehouse/logs/dt=2012-01-02/country=US/file6

选择ts、dt、line 从日志 国家在哪里

此查询将仅扫描文件1、文件2和文件4

扣件:

Bucketing是根据一些其他条件进一步分解/划分输入数据

我们可能希望将表(或分区)组织到存储桶中有两个原因

第一个是启用更高效的查询。Bucketing对表施加了额外的结构,Hive在执行某些查询时可以利用这些结构。特别是,两个表的联接(包括联接列)扣在同一列上,可以有效地实现为映射侧联接

创建表格的第二个原因是为了提高采样效率。在处理大型数据集时,在开发或优化数据集的过程中,对数据集的一小部分进行查询非常方便

让我们看看如何告诉Hive桌子应该扣上扣子。我们使用CLUSTERED BY子句指定要存储桶的列以及存储桶的数量:

创建表student(rollNo INT,name STRING),按(id)聚集到4个bucket中

从student TABLESAMPLE中选择*(rand()上的4个存储桶中的1个)

分区:

分区是根据某些条件分解/划分输入数据,例如:日期、国家/地区

创建表日志(ts BIGINT,行字符串) 分区依据(dt字符串、国家/地区字符串)

将数据本地加载到路径“input/hive/partitions/file1” 进入表日志分区(dt='2012-01-01',country='GB')

加载数据后在仓库中创建的文件如下:

/用户/hive/warehouse/logs/dt=2012-01-01/country=GB/file1/

/用户/hive/warehouse/logs/dt=2012-01-01/country=GB/file2/

/用户/hive/warehouse/logs/dt=2012-01-01/country=US/file3/

/用户/hive/warehouse/logs/dt=2012-01-02/country=GB/file4/

/用户/hive/warehouse/logs/dt=2012-01-02/country=US/file5/

/用户/hive/warehouse/logs/dt=2012-01-02/country=US/file6

选择ts、dt、line 从日志 国家在哪里

此查询将仅扫描文件1、文件2和文件4

扣件:

Bucketing是根据一些其他条件进一步分解/划分输入数据

我们可能希望将表(或分区)组织到存储桶中有两个原因

第一个是启用更高效的查询。Bucketing对表施加了额外的结构,Hive在执行某些查询时可以利用这些结构。特别是,两个表的联接(包括联接列)扣在同一列上,可以有效地实现为映射侧联接

创建表格的第二个原因是为了提高采样效率。在处理大型数据集时,在开发或优化数据集的过程中,对数据集的一小部分进行查询非常方便

让我们看看如何告诉Hive桌子应该扣上扣子。我们使用CLUSTERED BY子句指定要存储桶的列以及存储桶的数量:

创建表student(rollNo INT,name STRING),按(id)聚集到4个bucket中


从student TABLESAMPLE中选择*(rand()上的4个存储桶中的1个)

Bucketing和partitioning不是独占的,您可以同时使用它们

根据我相当长的配置单元经验,我的简短回答是“您应该始终使用分区,有时您可能也想使用bucket”

如果您有一个大表,分区有助于减少查询的数据量。分区通常表示为HDFS上的目录。一个常见的用法是按年/月/日进行分区,因为大多数人是按日期查询的。 唯一的缺点是您不应该对基数较大的列进行分区。 基数是大数据中的一个基本概念,它是一列可能具有的值的数量例如,“美国州”的基数较低(约50),而“ip_编号”的基数较大(2^32个可能的数字)。 如果您在一个具有高基数的字段上进行分区,那么配置单元将在HDFS中创建大量目录,这是不好的(namenode上的额外内存负载)

Bucketing可能很有用,但在将数据插入表时也必须遵守规则。Hive不会检查您插入的数据是否按预期方式扣合。 一个带扣的表必须进行聚类,这可能会在处理过程中增加额外的步骤。 但是,如果您进行了大量的连接,那么如果两个表都