ExIceberg.Schema (ExIceberg v0.3.0)

Schema definition for Iceberg tables using a declarative API similar to Ecto.Schema.

This module provides macros to define table schemas with proper type safety and a more Elixir-like API for working with Apache Iceberg tables.

Example

defmodule MyApp.UserSchema do
  use ExIceberg.Schema

  schema "users" do
    field :id, :long, required: true
    field :name, :string
    field :email, :string, required: true
    field :age, :int
    field :active, :boolean, default: true
    field :metadata, ExIceberg.Types.map(:string, :string)
    field :tags, ExIceberg.Types.list(:string)
    field :address, ExIceberg.Types.struct([
      ExIceberg.Types.field("street", :string),
      ExIceberg.Types.field("city", :string),
      ExIceberg.Types.field("zip", :int)
    ])
    field :balance, ExIceberg.Types.decimal(10, 2)
    field :created_at, :timestamp, required: true
    field :updated_at, :timestamptz
  end
end

# Usage:
{:ok, catalog, _} = MyApp.UserSchema.create_table(catalog, "my_namespace")

Supported Types

Primitive Types

  • :boolean - True or false
  • :int - 32-bit signed integer
  • :long - 64-bit signed integer
  • :float - 32-bit IEEE 754 floating point
  • :double - 64-bit IEEE 754 floating point
  • :string - UTF-8 character sequences
  • :uuid - Universally unique identifiers
  • :date - Calendar date without timezone
  • :time - Time of day in microsecond precision
  • :timestamp - Timestamp in microsecond precision, without timezone
  • :timestamptz - Timestamp in microsecond precision, with timezone
  • :binary - Arbitrary-length byte array

Complex Types

Use the helper functions from ExIceberg.Types:

  • ExIceberg.Types.decimal(precision, scale) - Fixed point decimal
  • ExIceberg.Types.fixed(length) - Fixed-length byte array
  • ExIceberg.Types.list(element_type, opts) - List of elements
  • ExIceberg.Types.map(key_type, value_type, opts) - Map of key-value pairs
  • ExIceberg.Types.struct(fields) - Struct with named fields

Field Options

  • :required - Whether the field is required (default: false)
  • :field_id - Explicit field ID (auto-assigned if not provided)

Summary

Functions

Defines a field in the table schema.

Defines the table schema with the given name and fields.

Functions

Link to this macro

field(name, type, opts \\ [])

(macro)

Defines a field in the table schema.

Parameters

  • name - The field name (atom)
  • type - The field type (atom or structured type)
  • opts - Field options (keyword list)

Examples

field :id, :long, required: true
field :price, ExIceberg.Types.decimal(10, 2)
field :tags, ExIceberg.Types.list(:string, element_required: false)
field :metadata, ExIceberg.Types.map(:string, :string)
field :address, ExIceberg.Types.struct([
  ExIceberg.Types.field("street", :string),
  ExIceberg.Types.field("city", :string)
])
Link to this macro

schema(table_name, list)

(macro)

Defines the table schema with the given name and fields.

Example

schema "my_table" do
  field :id, :long, required: true
  field :name, :string
end