{"record":{"id":"d9ed00a4df59e133","repo":"apache/iceberg","slug":"spark-does-not-support-time-fields-d9ed00","errorCode":null,"errorMessage":"Spark does not support time fields","messagePattern":"Spark does not support time fields","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java","lineNumber":131,"sourceCode":"  }\n\n  @Override\n  public DataType primitive(Type.PrimitiveType primitive) {\n    switch (primitive.typeId()) {\n      case BOOLEAN:\n        return BooleanType$.MODULE$;\n      case INTEGER:\n        return IntegerType$.MODULE$;\n      case LONG:\n        return LongType$.MODULE$;\n      case FLOAT:\n        return FloatType$.MODULE$;\n      case DOUBLE:\n        return DoubleType$.MODULE$;\n      case DATE:\n        return DateType$.MODULE$;\n      case TIME:\n        throw new UnsupportedOperationException(\"Spark does not support time fields\");\n      case TIMESTAMP:\n        Types.TimestampType ts = (Types.TimestampType) primitive;\n        if (ts.shouldAdjustToUTC()) {\n          return TimestampType$.MODULE$;\n        } else {\n          return TimestampNTZType$.MODULE$;\n        }\n      case STRING:\n        return StringType$.MODULE$;\n      case UUID:\n        // use String\n        return StringType$.MODULE$;\n      case FIXED:\n        return BinaryType$.MODULE$;\n      case BINARY:\n        return BinaryType$.MODULE$;\n      case DECIMAL:\n        Types.DecimalType decimal = (Types.DecimalType) primitive;","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/spark/v4.0/spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java#L113-L149","documentation":"TypeToSparkType converts Iceberg primitive types to Spark types. Iceberg supports a TIME primitive but Spark's type system has no time-of-day type, so conversion throws UnsupportedOperationException. This is a fundamental engine limitation, not a configuration error.","triggerScenarios":"Any operation that converts an Iceberg schema containing a Types.TimeType field to a Spark schema: DataFrame reads, spark.table scans, CTAS/RTAS planning, or schema conversion via SparkSchemaUtil.","commonSituations":"A table created outside Spark (e.g. Flink, Java API) contains a TIME column and a Spark job tries to read or write it.","solutions":["Remove or change the TIME column in the Iceberg schema to a supported type (e.g. store as long millis or timestamp)","Avoid reading the TIME column (project it out of the scan/schema)","Read the table with an engine that supports time type (e.g. Flink)"],"exampleFix":"// before\nTypes.NestedField.of(5, false, \"event_time\", Types.TimeType.get());\n// after\nTypes.NestedField.of(5, false, \"event_time\", Types.TimestampType.withZone());","handlingStrategy":"try-catch","validationCode":"boolean hasTime = table.schema().columns().stream().anyMatch(c -> c.type().typeId() == Types.TimeType.get().typeId());\nif (hasTime) { throw new IllegalArgumentException(\"Table contains TIME columns, unsupported in Spark\"); }","typeGuard":"boolean isTimeType(org.apache.iceberg.types.Type t) { return t.typeId() == org.apache.iceberg.types.Type.TypeID.TIME; }","tryCatchPattern":"try { Schema sparkSchema = SparkSchemaUtil.convert(table.schema()); } catch (UnsupportedOperationException e) { LOG.error(\"Schema has Spark-unsupported types: {}\", e.getMessage()); /* drop or remap the offending column */ }","preventionTips":["Never use Iceberg TimeType in tables consumed by Spark","Store time-of-day as long or timestamp instead","Project out TIME columns before Spark reads"],"tags":["spark","type-conversion","unsupported-type","schema"],"backgroundTag":"unsupported-operation","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}