Запрос слияния улья — ошибка при оценке кардинальности (_col0,_col1)

#sql #merge #hive #hiveql

#sql #слияние #улей #hiveql

Вопрос:

Я пытаюсь запустить запрос улья. Он завершается ошибкой со следующей ошибкой.

 Error: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row (tag=0) {"key":{"_col0":{"transactionid":0,"bucketid":-1,"rowid":1},"_col1":"2020-10-28"},"value":{"_col0":1}}
        at org.apache.hadoop.hive.ql.exec.mr.ExecReducer.reduce(ExecReducer.java:256)
        at org.apache.hadoop.mapred.ReduceTask.runOldReducer(ReduceTask.java:444)
        at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:392)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:170)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:422)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1866)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:164)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row (tag=0) {"key":{"_col0":{"transactionid":0,"bucketid":-1,"rowid":1},"_col1":"2020-10-28"},"value":{"_col0":1}}
        at org.apache.hadoop.hive.ql.exec.mr.ExecReducer.reduce(ExecReducer.java:244)
        ... 7 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Error evaluating cardinality_violation(_col0,_col1)
        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.mr.ExecReducer.reduce(ExecReducer.java:235)
        ... 7 more
Caused by: java.lang.RuntimeException: Cardinality Violation in Merge statement: [0, -1, 1],2020-10-12
        at org.apache.hadoop.hive.ql.udf.generic.GenericUDFCardinalityViolation.evaluate(GenericUDFCardinalityViolation.java:56)
        at org.apache.hadoop.hive.ql.exec.ExprNodeGenericFuncEvaluator._evaluate(ExprNodeGenericFuncEvaluator.java:186)
        at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:77)
        at org.apache.hadoop.hive.ql.exec.ExprNodeEvaluator.evaluate(ExprNodeEvaluator.java:65)
        at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:81)
        ... 15 more

Container killed by the ApplicationMaster.
Container killed on request. Exit code is 143
Container exited with a non-zero exit code 143
 

Ниже приведен запрос ,

 MERGE INTO TABLE1 A
using  (select * from TABLE2) B
ON
LOWER(TRIM(A.A)) = LOWER(TRIM(B.A)) AND
LOWER(TRIM(A.B)) = LOWER(TRIM(B.B))
WHEN MATCHED AND LOWER(TRIM(A.C)) = LOWER(TRIM(B.C))  OR TRIM(A.D)= TRIM(B.D)
THEN
UPDATE SET
A= regexp_replace(A,"[^ ']","#"),
B= regexp_replace(B,"[^@.]","#"),
C= regexp_replace(C,"[^.-]","#"),
D= regexp_replace(D, "[^ ']","#"),
E= regexp_replace(E, "[^ ']","#" ),
F= regexp_replace(F, "[^ . -]","#"),
G= regexp_replace(G,"[^ ']","#"),
H= regexp_replace(H,"[^ ']","#"),
I= regexp_replace(I,"[^ ']","#"),
J= regexp_replace(J,"[^ ']","#"),
K= regexp_replace(K,"[^ ']","#"),
L= regexp_replace(L,"[^ . -]","#"),
M= regexp_replace(M,"[^ ']","#"),
N= regexp_replace(N,"[^ ']","#"),
O= regexp_replace(O,"[^ ']","#"),
P= regexp_replace(P,"[^ ']","#"),
Q= regexp_replace(Q,"[^ ']","#"),
R= regexp_replace(R,"[^ . -]","#"),
S= regexp_replace(S,"[^ ']","#"),
T= regexp_replace(T,"[^  -.]","#");
 

Попытался переключить мощность, и это не удалось с arrayould связанного исключения.

Пожалуйста, поделитесь знаниями или идеями, имеющими какую-либо информацию или решение.

Проверил пару overstack и не нашел никаких подсказок, связанных с этой проблемой.

Заранее спасибо

Ответ №1:

Переключение проверки мощности ( hive.merge.cardinality.check=false ) приведет к некоторому повреждению данных, если оно вообще будет работать.

Изучите свои данные и устраните проблему. Проблема в том, что более 1 строки из TABLE2 совпадает с той же строкой в TABLE1. Это может быть дублирование в ключе соединения, которое вы можете исправить с помощью row_number filter или distinct и т. Д., Или Исправить ваше предложение ON, Добавить дополнительные ключи, которые сделают его уникальным.

Комментарии:

1. Я очистил дубликаты в table2. Может ли эта проблема возникнуть из-за того, что одна строка в table2 имеет несколько строк в Table1?

2. В таблице 2 полностью отсутствуют дубликаты (очищенные и проверенные снова), Но все равно возникает та же проблема. В Table2 всего 4 столбца, и не более того. Не уверен, что ключ объединения приводит к дублированию. Необходимо проверить то же самое.

3. @SamBerchmans как вы проверяли дубликаты? Я думаю, имеют значение только ключи в ON condition

4. Я попытался запустить join Table1 и table2 и попытался получить результирующие данные, чтобы увидеть, существует ли декартово произведение. Их немного. Попытался улучшить ключевые столбцы на том же уровне, чтобы избежать этих сбоев. Но по-прежнему никакой удачи. Также в таблице 2 были дубликаты, которые я очистил вручную с помощью функций distinct и raw_over().

5. @;eftjoin — я попытался выполнить то же, что и оператор Update , он завершается ошибкой со следующим исключением. Caused by: java.lang.ArrayIndexOutOfBoundsException: -1 at org.apache.hadoop.hive.ql.exec.FileSinkOperator.process(FileSinkOperator.java:790) at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:841) at org.apache.hadoop.hive.ql.exec.SelectOperator.process(SelectOperator.java:88) at org.apache.hadoop.hive.ql.exec.mr.ExecReducer.reduce(ExecReducer.java:235) ... 7 more Выглядит немного по-другому. Если вы также знаете об этом, пожалуйста, помогите.