Проблемы с Hive Merge - нарушение кардинальности - PullRequest
0 голосов
/ 02 октября 2018

У меня есть следующий оператор Merge:

  MERGE INTO          `s1`.`t1`   `t`
        USING               
        ( Select `q`.`a1`,
                             `q`.`a2`
        FROM (
         SELECT              `r`.`a1`,
                             `r`.`a2`,
                              ROW_NUMBER()
                                 OVER ( PARTITION BY `r`.a1
                                                   ORDER BY 
                            CAST(`r`.`a3` AS STRING)     DESC
                                                 ) `rank`
                                FROM                `s2`.`t2`)   q   
                               where q.rank = 1

        )  `s`
                         ON ( `t`.`a1` = `s`.`a1`)

 WHEN MATCHED THEN UPDATE 
    SET            ...
WHEN NOT MATCHED THEN INSERT VALUES ..

Где a1 - уникальное целое число, и оператор должен делать, когда исходная таблица имеет новую строку, затем вставляется в целевую таблицу и когдастрока, существующая в целевой таблице, затем обновляет строку в целевой таблице.Когда я запускаю оператор, я получаю следующую ошибку:

Caused by: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row (tag=0) {"key":{"_col0":{"transactionid":A,"bucketid":B,"rowid":C}},"value":{"_col0":2}}
at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordSource.pushRecord(ReduceRecordSource.java:284)
    at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordProcessor.run(ReduceRecordProcessor.java:266)
    at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:150)
    ... 14 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row (tag=0) {"key":{"_col0":{"transactionid":A,"bucketid":B,"rowid":C}},"value":{"_col0":2}}
    at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordSource$GroupIterator.next(ReduceRecordSource.java:352)
    at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordSource.pushRecord(ReduceRecordSource.java:274)
    ... 16 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating cardinality_violation(_col0)
    at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:86)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:841)
    at org.apache.hadoop.hive.ql.exec.FilterOperator.process(FilterOperator.java:122)
    at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:841)
    at org.apache.hadoop.hive.ql.exec.GroupByOperator.forward(GroupByOperator.java:1022)
    at org.apache.hadoop.hive.ql.exec.GroupByOperator.processAggr(GroupByOperator.java:827)
    at org.apache.hadoop.hive.ql.exec.GroupByOperator.processKey(GroupByOperator.java:701)
    at org.apache.hadoop.hive.ql.exec.GroupByOperator.process(GroupByOperator.java:767)
    at org.apache.hadoop.hive.ql.exec.tez.ReduceRecordSource$GroupIterator.next(ReduceRecordSource.java:343)
    ... 17 more

Я проверил выбор из источника, у меня нет дубликатов.Хотя добавление лимита как слияние к слиянию решило проблему (у меня менее 10000 записей в исходной таблице).Любая идея, почему или как я могу найти настоящую проблему?

MERGE INTO          `s1`.`t1`   `t`
        USING               
        ( Select `q`.`a1`,
                             `q`.`a2`
        FROM (
         SELECT              `r`.`a1`,
                             `r`.`a2`,
                              ROW_NUMBER()
                                 OVER ( PARTITION BY `r`.a1
                                                   ORDER BY 
                            CAST(`r`.`a3` AS STRING)     DESC
                                                 ) `rank`
                                FROM                `s2`.`t2`)   q   
                               where q.rank = 1 limit 10000

        )  `s`
                         ON ( `t`.`a1` = `s`.`a1`)

 WHEN MATCHED THEN UPDATE 
    SET            ...
WHEN NOT MATCHED THEN INSERT VALUES ..
...