【问题标题】:Dynamic partition cannot be the parent of a static partition动态分区不能是静态分区的父级
【发布时间】:2016-03-18 06:06:52
【问题描述】:

我正在尝试在 Hive 中的另一个表(保存相同的数据但始终保持)中汇总 1 个表(其数据每月重新计算)中的数据。但是,每当我尝试合并数据时,都会出现以下错误:

FAILED: SemanticException [Error 10094]: Line 3:74 Dynamic partition cannot be the parent of a static partition 'category'

我用来创建表格的代码如下:

create table my_data_by_category (views int, submissions int)
    partitioned by (category string)
    row format delimited
    fields terminated by ','
    escaped by '\\'
    location '${hiveconf:OUTPUT}/${hiveconf:DATE_DIR}/my_data_by_category';

create table if not exists my_data_lifetime_total_by_category
    like my_data_by_category
    row format delimited
    fields terminated by ','
    escaped by '\\'
    stored as textfile
    location '${hiveconf:OUTPUT}/lifetime-totals/my_data_by_category';

我用来填充表格的代码如下:

insert overwrite table my_data_by_category partition(category)
    select mdcc.col1, mdcc2.col2, pcc.category
    from my_data_col1_counts_by_category mdcc
    left outer join my_data_col2_counts_by_category mdcc2 where mdcc.category = mdcc2.category
    group by mdcc.category, mdcc.col1, mdcc2.col2;

insert overwrite table my_data_lifetime_total_by_category partition(category)
   select mdltc.col1 + mdc.col1 as col1, mdltc.col2 + mdc.col2, mdc.category
   from my_data_lifetime_total_by_category mdltc
   full outer join my_data_by_category mdc on mdltc.category = mdc.category
   where mdltc.col1 is not null and mdltc.col2 is not null;

令人沮丧的部分是我将这些数据分区到另一列上,并且对该分区重复相同的过程没有问题。我试过用谷歌搜索“动态分区不能是静态分区的父级”错误消息,但我找不到任何关于导致此问题的原因或如何修复它的指导。我很确定我的一个或多个表的设置方式存在问题,但我看不出是什么。是什么导致了这个错误,我能做些什么来解决它?

【问题讨论】:

  • 我知道这确实很旧,但我遇到了这个问题,并且没有关于这个错误的任何信息。至少对我来说,问题是由于计算字段没有列别名。在上述情况下,mdltc.col2 + mdc.col2 应该是 mdltc.col2 + mdc.col2 as col2。关于错误的任何内容都不会表明这是问题,但这绝对是为我解决问题的原因。

标签: hive


【解决方案1】:

此脚本中没有 partitioned by 子句。当您尝试在插入语句中使用分区插入非分区表时,它失败了。

create table if not exists my_data_lifetime_total_by_category
    like my_data_by_category
    row format delimited
    fields terminated by ','
    escaped by '\\'
    stored as textfile
    location '${hiveconf:OUTPUT}/lifetime-totals/my_data_by_category';

【讨论】:

  • 但是如果 my_data_by_category 是分区的,like 子句不应该将该分区带到 my_data_lifetime_total_by_category 吗?
  • 不,您需要将分区子句定义为 DDL 命令的一部分。
  • 在我测试 Hive 脚本时,每次尝试添加“partitioned by”子句都会产生错误。同样,我有多个其他表可以在没有显式添加分区的情况下工作,所以我不明白为什么这 1 个表有问题。
  • 你能分享你用来创建表和插入命令的 DDL 命令吗?
  • create table和insert overwrite table命令在原题中,可以搜索my_data_lifetime_total_by_category查看。
【解决方案2】:

没有。您不需要添加分区子句。

你在insert overwrite table my_data_by_category partition(category).... 中做group by mdcc.category。但您没有使用任何 UDAF。 你确定你能做到吗?

【讨论】:

  • category是mdcc中的一个字段,所以不需要UDAF。
  • 在您尝试分组的选择子句中没有 mdcc.category 列。
  • 我的意思是有一个错字。您使用的是“mdcc.category”而不是“pcc.category”。您可以在 GROUP BY 或 SELECT 子句中进行更改。
【解决方案3】:

我认为,如果您将第二个创建语句更改为:

create table if not exists my_data_lifetime_total_by_category
partitioned by (category string)
row format delimited
fields terminated by ','
escaped by '\\'
stored as textfile
location '${hiveconf:OUTPUT}/lifetime-totals/my_data_by_category';

你应该没有错误

【讨论】:

    猜你喜欢
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2020-10-28
    • 1970-01-01
    相关资源
    最近更新 更多