2016-05-03 22 views
0

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.

Antwort

0

Wenn Sie die Hive datatype implicit conversions sehen, erlaubt es keine Umwandlung von String zu Boolean.

Und Sie fragen, where t1.TRANS_DESC1 versucht TRANS_DESC1 als boolean Art zu lesen, das ist, warum es java.lang.ClassCastException

+0

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

-1

wirft laden Sie bitte Ihre Strukturtabelle und stellen Sie sicher, dass alle Daten vom Typ gleichen müssen, die Umwandlung von Datentyp unzutreffend .

+0

Die Tabellendefinition wurde hinzugefügt. – gyan