Heute habe ich ein seltsames Verhalten mit Bienenstock (MAPR Verteilung Hive 0.13.0-MAPR-1508-21228)Hive ungültige Abfrage akzeptiert und warf Runtime
Tabellendefinition:
CREATE EXTERNAL TABLE gd_temp_test.rate_merchants_test(
ROW_KEY string,
TRANS_DESC1 string,
TRANS_DESC2 string,
TRANS_DESC3 string,
TRANS_ID string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\u0001' LINES TERMINATED BY '\n'
STORED AS textfile
LOCATION '/home/gd/tempdata';
Wenn die unten Abfrage wird ausgeführt, es hat das gleiche akzeptiert und eine RuntimeException ausgelöst.
select * from gd_temp_test.rate_merchants_test t1 where t1.TRANS_DESC1 limit 1;
Bitte beachten Sie, dass die Tabelle in der Abfrage eine externe Tabelle ist und die TRANS_DESC1
ist von String
Typ.
Exception
at org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:195)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:435)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:168)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1566)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row .................
... 8 more
Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Boolean
at org.apache.hadoop.hive.ql.exec.FilterOperator.processOp(FilterOperator.java:134)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
at org.apache.hadoop.hive.ql.exec.TableScanOperator.processOp(TableScanOperator.java:92)
at org.apache.hadoop.hive.ql.exec.Operator.forward(Operator.java:796)
at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:540)
... 9 more
erwartete ich es richtig auf Parsing oder Auswertung der Plan zur Ausführung abzulehnen. Wenn ich eine Abfrage erklären tat,
explain select * from gd_temp_test.rate_merchants_test t1 where t1.TRANS_DESC1 limit 1;
Es war in der Lage, diese Abfrage zu erklären.
Explain
STAGE DEPENDENCIES:
Stage-1 is a root stage
Stage-0 is a root stage
STAGE PLANS:
Stage: Stage-1
Map Reduce
Map Operator Tree:
TableScan
alias: t1
Statistics: Num rows: 344 Data size: 1238497 Basic stats: COMPLETE Column stats: NONE
Filter Operator
predicate: trans_desc1 (type: string)
Statistics: Num rows: 172 Data size: 619248 Basic stats: COMPLETE Column stats: NONE
Select Operator
expressions: row_key (type: string), trans_desc1 (type: string), trans_desc2 (type: string), trans_desc3 (type: string), trans_id (type: string)
outputColumnNames: _col0, _col1, _col2, _col3, _col4
Statistics: Num rows: 172 Data size: 619248 Basic stats: COMPLETE Column stats: NONE
Limit
Number of rows: 1
Statistics: Num rows: 1 Data size: 3600 Basic stats: COMPLETE Column stats: NONE
File Output Operator
compressed: false
Statistics: Num rows: 1 Data size: 3600 Basic stats: COMPLETE Column stats: NONE
table:
input format: org.apache.hadoop.mapred.TextInputFormat
output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
Stage: Stage-0
Fetch Operator
limit: 1
Time taken: 0.196 seconds, Fetched: 33 row(s)
Eine Erklärung, was dazu führen könnte, dass bis zur Laufzeit gewartet wurde? Ist es normales Verhalten?
EDIT 1: Beispieltabellendefinition hinzugefügt.
Aber ich kann das nicht verstehen. Hive kannte das Schema der Tabelle zum Zeitpunkt der Auswertung und es kann leicht abgeleitet werden, dass der Ausdruck nicht in Boolean resultieren kann. Also, warum hat es bis zur Ausführung gewartet, um einen Laufzeitfehler zu melden. – gyan