Hi Team,
Running tests against Iceberg backed Hive tables I was trying to run this query:
SELECT * from date_test WHERE d_date='1998-02-19'
The query fails with the Exception below. Basically complains that when
filtering the Date field it expects an Integer in the Record, but finds a
LocalDate object instead.
I am confused now, because my mental model was - until now - that Iceberg
records stores data like:
LocalDate - Types.DateType,
LocalDateTime - Types.TimestampType.withoutZone,
OffsetDateTime - Types.TimestampType.withZone,
Debugging the query above I have found that the expression evaluation expects
different types in the Record defined in org.apache.iceberg.types.Type where we
define:
Date - Integer,
Timestamp - Long
Do I supposed to prepare the Record for expression evaluation, so the evaluator
could find the correct type?
What part of the puzzle I miss?
Thanks,
Peter
The exception:
Caused by: org.apache.hive.service.cli.HiveSQLException: java.io.IOException:
java.lang.IllegalStateException: Not an instance of java.lang.Integer:
2130-01-20
at
org.apache.hive.service.cli.operation.SQLOperation.getNextRowSet(SQLOperation.java:499)
at
org.apache.hive.service.cli.operation.OperationManager.getOperationNextRowSet(OperationManager.java:307)
at
org.apache.hive.service.cli.session.HiveSessionImpl.fetchResults(HiveSessionImpl.java:878)
at
org.apache.hive.service.cli.CLIService.fetchResults(CLIService.java:559)
at
org.apache.hive.service.cli.CLIService.fetchResults(CLIService.java:551)
at
org.apache.iceberg.mr.hive.TestHiveShell.executeStatement(TestHiveShell.java:143)
... 62 more
Caused by: java.io.IOException: java.lang.IllegalStateException: Not an
instance of java.lang.Integer: 2130-01-20
at
org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:521)
at
org.apache.hadoop.hive.ql.exec.FetchOperator.pushRow(FetchOperator.java:428)
at org.apache.hadoop.hive.ql.exec.FetchTask.fetch(FetchTask.java:147)
at org.apache.hadoop.hive.ql.Driver.getResults(Driver.java:2208)
at
org.apache.hive.service.cli.operation.SQLOperation.getNextRowSet(SQLOperation.java:494)
... 67 more
Caused by: java.lang.IllegalStateException: Not an instance of
java.lang.Integer: 2130-01-20
at org.apache.iceberg.data.GenericRecord.get(GenericRecord.java:123)
at org.apache.iceberg.Accessors$PositionAccessor.get(Accessors.java:71)
at org.apache.iceberg.Accessors$PositionAccessor.get(Accessors.java:58)
at
org.apache.iceberg.expressions.BoundReference.eval(BoundReference.java:39)
at
org.apache.iceberg.expressions.Evaluator$EvalVisitor.eq(Evaluator.java:132)
at
org.apache.iceberg.expressions.Evaluator$EvalVisitor.eq(Evaluator.java:52)
at
org.apache.iceberg.expressions.ExpressionVisitors$BoundVisitor.predicate(ExpressionVisitors.java:249)
at
org.apache.iceberg.expressions.ExpressionVisitors.visitEvaluator(ExpressionVisitors.java:346)
at
org.apache.iceberg.expressions.Evaluator$EvalVisitor.eval(Evaluator.java:57)
at
org.apache.iceberg.expressions.Evaluator$EvalVisitor.access$100(Evaluator.java:52)
at org.apache.iceberg.expressions.Evaluator.eval(Evaluator.java:49)
at
org.apache.iceberg.mr.mapreduce.IcebergInputFormat$IcebergRecordReader.lambda$applyResidualFiltering$0(IcebergInputFormat.java:288)
at
org.apache.iceberg.io.CloseableIterable$3.shouldKeep(CloseableIterable.java:82)
at org.apache.iceberg.io.FilterIterator.advance(FilterIterator.java:67)
at org.apache.iceberg.io.FilterIterator.hasNext(FilterIterator.java:50)
at
org.apache.iceberg.mr.mapreduce.IcebergInputFormat$IcebergRecordReader.nextKeyValue(IcebergInputFormat.java:202)
at
org.apache.iceberg.mr.mapred.MapredIcebergInputFormat$MapredIcebergRecordReader.next(MapredIcebergInputFormat.java:104)
at
org.apache.iceberg.mr.mapred.MapredIcebergInputFormat$MapredIcebergRecordReader.next(MapredIcebergInputFormat.java:81)
at
org.apache.hadoop.hive.ql.exec.FetchOperator.getNextRow(FetchOperator.java:488)
... 71 more