Apache HIVE中的分区,更多问题

Apache HIVE中的分区,更多问题,hive,hortonworks-data-platform,Hive,Hortonworks Data Platform,这里有一些很好的问题/答案 但我还有一些,不幸的是,第24页没有很好的解释: 我的问题是: 在上面的示例中: CREATE TABLE pageviews (userid VARCHAR(64), link STRING, from STRING) PARTITIONED BY (datestamp STRING) CLUSTERED BY (userid) INTO 256 BUCKETS; INSERT INTO TABLE pageviews PARTITION (date

这里有一些很好的问题/答案

但我还有一些,不幸的是,第24页没有很好的解释:

我的问题是:

在上面的示例中:

CREATE TABLE pageviews (userid VARCHAR(64), link STRING, from STRING)
 PARTITIONED BY (datestamp STRING) CLUSTERED BY (userid) INTO 256 BUCKETS;

 INSERT INTO TABLE pageviews PARTITION (datestamp = '2014-09-23') VALUES
  ('jsmith', 'mail.com', 'sports.com'), ('jdoe', 'mail.com', null);

  INSERT INTO TABLE pageviews PARTITION (datestamp) VALUES ('tjohnson',
  'sports.com', 'finance.com', '2014-09-23'), ('tlee', 'finance.com', null,
  '2014-09-21'); 
为什么页面视图的模式中不存在“日期戳字符串”

为什么它被定义为字符串?不应该是时间戳吗

为什么第二个insert没有找到它,只作为类型,而作为值(即“2014-09-23”和“2014-09-21”)插入?为什么页面视图的架构中不存在“日期戳字符串”?

尽管datestamp的外观和行为类似于架构中定义的标准列,但它实际上只是对表的基础数据的特定分区的引用。当您在datestamp列中看到“2014-09-23”时,它实际上并没有向您显示某个数据文件中某个特定记录中包含的值,而是告诉您您可能会发现该行其余部分的数据来自一个名为“datestamp=2014-09-23”的HDFS目录,该目录包含一个分区或“区块”这是一个很大的优化过程,因为过滤一个查询到一个特定的分区可以让配置单元简单地转到该特定目录中的数据,而忽略其他n个分区中包含的数据

为什么定义为字符串?应该是时间戳?

由于分区只是引用目录名,因此类型是特定日期格式的字符串表示而不是时间戳或日期才有意义。从概念上讲,日期字段没有意义,因为尽管“2014-09-23”和“9/23/2014”是两个相等的日期戳,但如果它们是目录名。换句话说,如果一个目录名为“2014-09-23”,你不能用任何其他名称来引用它,使它更像一个字符串,而不像一个日期,它有许多替代形式都是等效的。此外,Hive已经将日期视为字符串,这使它成为一个比int类型更好的解决方案。例如如果将时间戳传递给配置单元的to_date()用户定义函数,它将以字符串形式返回日期

另外,由于您提到了时间戳,使用一个完整的时间戳(其中包含几分之一秒)对于分区来说是一个坏主意,即使您使用它的字符串表示形式。您最终会得到大量的分区,每个分区中可能有一条或最多只有几条记录。我想您很快就会丢失每一条记录分区的性能优势

为什么第二个插入项没有显示它,并且只作为类型显示,而作为值显示(即“2014-09-23”和“2014-09-21”)


这只是产生相同结果的一种不同语法。当您包括分区时,配置单元将假定值数组末尾的值引用分区。因此,如果您的架构中有一个表,其中有3列和1个分区,那么当您执行insert into table命令并指定分区时(datestamp),您只需传入4个值,Hive就会知道前3个值将插入到架构中的3列中,第四个值表示要将此记录的数据添加到哪个datestamp分区。

很好的解释,只是一个关于第三点的问题,如果分区是由两列完成的(比如说a,b),所以我实际上可以有(att1,att2,att3,a,b)?应该一直是这样吗?我想这两个都是不可能的(att1,att2,att3,a)?或者(att1,att2,att3,b)@mohsenhs伟大的问题。当你有多个分区时,分区(和目录)将是分层的,基于顺序(a,b)。在行为方面,它有助于记住目录结构。在您的示例中,b分区将是a分区的子文件夹,即a='part1'/b='subpart1'&&Uuu a='part1'/b='subpart2',所以,若您插入数据,您可以看到您将需要同时包含两个分区,因为它需要知道要进入哪个分区文件夹nto,然后在该文件夹中的哪个b子分区文件夹中放置记录。