У меня есть следующий оператор 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 ..