蜂巢脚本的批量执行导致问题

时间:2018-08-15 15:14:46

标签: hive hiveql

我首先要说的是,如果您需要更多信息,请让我知道,我试图使这一过程尽可能简单,但是如果需要,我可以提供完整的详细信息。

所以我有一个基本的hql脚本

INSERT INTO TABLE ${DB_NAME}.${TABLE_NAME} PARTITION (SNAPSHOT_YEAR_MONTH,SNAPSHOT_DAY)
SELECT 
`(snapshot_year_month|snapshot_day|row_num)?+.+`,
'${SNAPSHOT_YEAR}' as snapshot_year_month,
'${SNAPSHOT_DAY}'  as snapshot_day
FROM
(SELECT
*,
ROW_NUMBER() OVER ( PARTITION BY  ${PK} ORDER BY time_s DESC,wanted_c DESC ) AS row_num  
FROM
( SELECT ${COL} FROM ${SOURCE_DB_NAME}.${SRC_TABLE_NAME} WHERE (concat(snapshot_year_month,snapshot_day) = '${LOWER_LIMIT}${LOWER_LIMIT_DAY}')
UNION ALL
SELECT ${COL} FROM ${SOURCE_DB_NAME}.${SRC_TABLE_NAME} WHERE (concat(snapshot_year_month,snapshot_day) >'${LOWER_LIMIT}${LOWER_LIMIT_DAY}' and concat(snapshot_year_month,snapshot_day) <='${UPPER_LIMIT}${UPPER_LIMIT_DAY}') ) B) A 
WHERE A.row_num = 1 ;

此基本脚本生成需要运行的数百个配置单元查询。需要注意的重要部分是WHERE a.row_num = 1,它可以防止${PK}的任何组合包含多于一行的内容。现在,这些脚本已成功生成并存储在hql文件中。然后,我有一个批处理脚本来运行所有这些配置单元脚本

for f in *.hql ; do beeline -u 'myserverinfo' -f $f ; done

现在,如果文件夹中只有几个文件,则一切正常。但是,如果我在文件夹中放入500个hqls,则不会正确删除任何重复项(当文件夹中只有几个hqls时,它们会被正确删除)。

例如,

如果我有一个像这样的数据集

| my_pk1 | my_pk2 | time_s | wanted_c | other cols... |
    1        1        1          1           ...
    1        1        2          5           ...
    1        1        6          6           ...

如果我的批处理脚本中只有几个hql文件正在运行,它将正确地将其压缩为-

| my_pk1 | my_pk2 | time_s | wanted_c | other cols... |
    1        1        6          6           ...

但是,如果我放下500多个要运行的hql脚本,则正确插入了分区,所有的hql脚本都运行并具有数据,但是它们都具有重复的主键,并且该表与EXACT相同的hql脚本会输出

| my_pk1 | my_pk2 | time_s | wanted_c | other cols... |
    1        1        1          1           ...
    1        1        2          5           ...
    1        1        6          6           ...

这对我来说绝对没有意义。关于可能发生的事情有什么想法吗?很抱歉,这没有道理。

0 个答案:

没有答案