【问题标题】:Hive writes to partition and DEFAULTHive 写入分区和 DEFAULT
【发布时间】:2017-04-15 02:39:06
【问题描述】:

我有一个日期时间表、事实表和一个分区表。目标是将 date_time 加入事实并插入到分区表中。它正在工作,因为我可以验证/apps/hive/warehouse/dbname.db/p_tbl/p_year=2016/p_month=01/p_day=01 以及其他几个年、月、日文件夹是否存在。但是我也有p_year=__HIVE_DEFAULT_PARTITION__/p_month=__HIVE_DEFAULT_PARTITION__/p_day=__HIVE_DEFAULT_PARTITION__ 充满了应该有自己的分区的数据。为什么有些年、月、日分区在工作,而在其他日期它们被写入HIVE_DEFAULT?是的,我为我的帖子重命名为 generic,而不是真正的 db、tbl、col 名称......

CREATE EXTERNAL TABLE ${DB_NAME_HIVE}.date_time(
date_time_key bigint,
label_yyyy varchar(32),
label_mm varchar(32),
label_dd varchar(32)
)
row format delimited
fields terminated by ','
lines terminated by '\n'
LOCATION '${TARGET_PATH}date_time'
;

CREATE EXTERNAL TABLE ${DB_NAME_HIVE}.p_table(
date_time_key bigint,
column_0 varchar(50),
column_1 char(32),
column_2 timestamp,
column_3 bigint,
column_4 tinyint
)
PARTITIONED BY(p_year string, p_month string, p_day string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION '${TARGET_PATH}my_table'
;


USE ${DB_NAME_HIVE};
INSERT INTO TABLE ${DB_NAME_HIVE}.p_tbl PARTITION(p_year, p_month, p_day)
SELECT
mt.date_time_key,
mt.col_0,
mt.col_1,
mt.col_2,
mt.col_3,
mt.col_4,
dt.label_yyyy,
dt.label_mm,
dt.label_dd
FROM my_tbl mt
LEFT OUTER JOIN date_time dt on (mt.date_time_key = dt.date_time_key)
;

INFO  :          Time taken for load dynamic partitions : 12557
INFO  :         Loading partition {p_year=2016, p_month=11, p_day=15}
INFO  :         Loading partition {p_year=2016, p_month=07, p_day=20}
INFO  :         Loading partition {p_year=2014, p_month=08, p_day=06}
INFO  :         Loading partition {p_year=2015, p_month=04, p_day=05}
INFO  :         Loading partition {p_year=2012, p_month=10, p_day=31}
INFO  :         Loading partition {p_year=2014, p_month=04, p_day=16}
INFO  :         Loading partition {p_year=2014, p_month=09, p_day=06}
INFO  :         Loading partition {p_year=2014, p_month=09, p_day=09}
INFO  :         Loading partition {p_year=2012, p_month=11, p_day=22}
INFO  :         Loading partition {p_year=2014, p_month=11, p_day=19}
INFO  :         Loading partition {p_year=2014, p_month=09, p_day=03}
INFO  :         Loading partition {p_year=2013, p_month=12, p_day=24}
INFO  :         Loading partition {p_year=2014, p_month=10, p_day=29}
INFO  :         Loading partition {p_year=2015, p_month=09, p_day=04}
INFO  :         Loading partition {p_year=2015, p_month=05, p_day=11}
INFO  :         Loading partition {p_year=2016, p_month=06, p_day=13}
INFO  :         Loading partition {p_year=2014, p_month=09, p_day=24}
INFO  :         Loading partition {p_year=2014, p_month=10, p_day=21}
INFO  :         Loading partition {p_year=2016, p_month=01, p_day=06}
INFO  :         Loading partition {p_year=2014, p_month=11, p_day=05}
INFO  :         Loading partition {p_year=2012, p_month=12, p_day=04}
INFO  :         Loading partition {p_year=2016, p_month=11, p_day=25}
INFO  :         Loading partition {p_year=2014, p_month=10, p_day=13}
INFO  :         Loading partition {p_year=2013, p_month=06, p_day=21}
INFO  :         Loading partition {p_year=2013, p_month=06, p_day=27}
INFO  :         Loading partition {p_year=2014, p_month=10, p_day=22}
INFO  :         Loading partition {p_year=2016, p_month=11, p_day=22}
INFO  :         Loading partition {p_year=2012, p_month=10, p_day=26}
INFO  :         Loading partition {p_year=2014, p_month=08, p_day=28}
INFO  :         Loading partition {p_year=2013, p_month=10, p_day=21}
INFO  :         Loading partition {p_year=2014, p_month=09, p_day=04}
INFO  :         Loading partition {p_year=2013, p_month=11, p_day=14}
INFO  :         Loading partition {p_year=2013, p_month=10, p_day=22}
INFO  :         Loading partition {p_year=2014, p_month=08, p_day=26}
INFO  :         Loading partition {p_year=2012, p_month=10, p_day=30}
INFO  :         Loading partition {p_year=2014, p_month=05, p_day=23}
INFO  :         Loading partition {p_year=2012, p_month=10, p_day=29}
INFO  :         Loading partition {p_year=2014, p_month=09, p_day=02}
INFO  :         Loading partition {p_year=__HIVE_DEFAULT_PARTITION__, p_month=__HIVE_DEFAULT_PARTITION__, p_day=__HIVE_DEFAULT_PARTITION__}
INFO  :         Loading partition {p_year=2014, p_month=09, p_day=05}
INFO  :         Loading partition {p_year=2016, p_month=07, p_day=25}
INFO  :         Loading partition {p_year=2016, p_month=08, p_day=10}

【问题讨论】:

    标签: hadoop hive hql partitioning partition


    【解决方案1】:

    使用 Hive 中的动态分区,如果存在空值,则将它们写入 Hive 默认分区。因此,为了解决这个问题,您可以清理源数据以填充空值或删除它们。

    【讨论】:

    • 只是为了澄清它在“行”的任何列中是否为空值?我知道我的 date_time 和事实表是干净的,总会有年、月、日。
    • 要么是源中的空值,要么是连接中的 select 语句创建的空值,要么是某种数据类型错误,将值存储为空值,如果您的源表很好,则可能是这种情况.
    【解决方案2】:

    此问题已通过NOT 解决,方法是使用DATE_TIME 表并使用内置HIVE 函数YEAR();MONTH();DAY(); 针对数据中的TIMESTAMP 列。这些函数返回一个INT,它被传递给分区。

    示例

    CREATE EXTERNAL TABLE ${DB_NAME_HIVE}.my_tbl(
    unique_id char(32),
    some_name varchar(50),
    some_group varchar(50),
    in_time_start timestamp,
    in_time_finish timestamp
    )
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    LOCATION '${TARGET_PATH}my_tbl';
    
    CREATE EXTERNAL TABLE ${DB_NAME_HIVE}.my_tbl_p(
    unique_id char(32),
    some_name varchar(50),
    some_group varchar(50),
    in_time_start timestamp,
    in_time_finish timestamp
    )
    PARTITIONED BY(p_year int, p_month int, p_day int)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n'
    STORED AS ORC
    LOCATION '${TARGET_PATH}my_tbl_p'
    ;
    
    INSERT INTO TABLE ${DB_NAME_HIVE}.my_tbl_p PARTITION(p_year, p_month, p_day)
    SELECT
    unique_id,
    some_name,
    some_group,
    in_time_start,
    in_time_finish,
    year(in_time_start) as p_year,
    month(in_time_start) as p_month,
    day(in_time_start) as p_day
    FROM my_tbl
    ;
    

    【讨论】:

    • 在问题中,创建了p_table 并插入了p_tbl,可能是错字。这个解决方案是正确的,但原来失败的原因是左连接。一个date_time维度表应该有所有可能的(实用的)date_time_key预加载,这意味着一个安全的内连接。空分区值表示my_tbl 中的行与date_time 表中的任何行都不匹配。即事实表中的date_time_key 为空或无效,或者date_time 维度表中缺少所需的行。但是,是的,这些函数是动态的,比连接更快、更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2018-01-03
    • 2017-12-07
    相关资源
    最近更新 更多