Skip to content

Commit fcff741

Browse files
committed
ice: Fix metrics generated for time/timestamp* columns with millisecond precision
1 parent 6196bb3 commit fcff741

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

ice/src/main/java/org/apache/iceberg/parquet/ParquetConversions.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.apache.iceberg.expressions.Literal;
2929
import org.apache.iceberg.types.Type;
3030
import org.apache.parquet.io.api.Binary;
31+
import org.apache.parquet.schema.LogicalTypeAnnotation;
3132
import org.apache.parquet.schema.LogicalTypeAnnotation.DecimalLogicalTypeAnnotation;
3233
import org.apache.parquet.schema.PrimitiveType;
3334

@@ -45,10 +46,17 @@ static <T> Literal<T> fromParquetPrimitive(Type type, PrimitiveType parquetType,
4546
case LONG:
4647
case TIME:
4748
case TIMESTAMP:
49+
// time & timestamp/timestamptz are stored in microseconds
50+
// https://iceberg.apache.org/spec/#parquet
51+
var millis =
52+
(parquetType.getLogicalTypeAnnotation()
53+
instanceof LogicalTypeAnnotation.TimestampLogicalTypeAnnotation t
54+
&& t.getUnit() == LogicalTypeAnnotation.TimeUnit.MILLIS);
4855
if (parquetType.getPrimitiveTypeName() == PrimitiveType.PrimitiveTypeName.INT32) { // uint32
49-
return (Literal<T>) Literal.of(Long.valueOf((Integer) value));
56+
long v = ((Integer) value).longValue();
57+
return (Literal<T>) Literal.of(millis ? v * 1000L : v);
5058
}
51-
return (Literal<T>) Literal.of((Long) value);
59+
return (Literal<T>) Literal.of(millis ? (Long) value * 1000L : (Long) value);
5260
case FLOAT:
5361
return (Literal<T>) Literal.of((Float) value);
5462
case DOUBLE:

0 commit comments

Comments
 (0)