dataframe / dataframe-arrow
AGENTS.md1.1k starsChanged 26 days agoApache-2.0View on GitHub
Guidance for this module. See the root AGENTS.md for repo-wide build/style/KoDEx rules; only module-specific details are here. dataframe-arrow (artifact dataframe-arrow, "Apache Arrow support for Kotlin DataFrame"). Reads and writes the two Apache Arrow IPC formats and reads Parquet: - Arrow IPC / streaming format — readArrowIPC / writeArrowIPC. - Arrow random-access / Feather format — readArrowFeather / writeArrowFeather. - Parquet (read-only) — readParquet, implemented on top of Arrow Dataset (FileFormat.PARQUET). There is no Parquet writer here. Depends only on core.…
Trending
Less talk lately.about the whole repository
Who's talking about Kotlin/dataframe
- Kotlin/kandy“Support compose multiplatform”GitHub · Dec 14, 2023 · 45 reactions
- Kotlin/kotlin-agent-skills“Add a Skill for working with Kotlin DataFrame”GitHub · May 19, 2026 · 6 reactions
- deephaven/deephaven-csv“Read files with different encodings”GitHub · Nov 11, 2025 · 2 reactions
- Velkonost/sssss“deps(gradle): bump org.jetbrains.kotlinx:dataframe from 0.13.1 to 0.15.0”GitHub · Oct 15, 2025 · 2 reactions
- jeremymailen/kotlinter-gradle“Wired issues when Upgrading to Kotlin 1.8.20 ”GitHub · Apr 12, 2023 · 2 reactions
The biggest 5 of 51 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 51
Talked about on GitHub and Bluesky (51 times).
On GitHub · 50
- Dec 14, 2023Support compose multiplatform — Kotlin/kandy45 reactions · 7 comments
- May 19, 2026Add a Skill for working with Kotlin DataFrame — Kotlin/kotlin-agent-skills6 reactions
- Nov 11, 2025Read files with different encodings — deephaven/deephaven-csv2 reactions · 2 comments
- Oct 15, 2025deps(gradle): bump org.jetbrains.kotlinx:dataframe from 0.13.1 to 0.15.0 — Velkonost/sssss2 reactions · 1 comment
- Apr 12, 2023Wired issues when Upgrading to Kotlin 1.8.20 — jeremymailen/kotlinter-gradle2 reactions · 9 comments
45 more on GitHub
- Sep 25, 2026fix(deps): update all dependencies — salesforce-misc/ReVoman1 reaction · 1 comment
- Dec 9, 2024chore(deps): update dependency org.jetbrains.kotlinx:dataframe to v0.15.0 — Kotlin/kotlin-jupyter-libraries1 reaction
- May 27, 2024Remove `concatFixed()` — Kotlin/kandy1 reaction
- Nov 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-rc02 to 1.0.0-rc02n — sureshg/native-image-playground0 reactions · 2 comments
- Oct 30, 2026[KDF] Support columnOf(vararg DataFrame) FrameColumn creation — JetBrains/kotlin0 reactions · 18 comments
- Oct 29, 2026Move `@sample` after the removal of escape characters — Jolanrensen/KoDEx0 reactions · 2 comments
- Oct 26, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc02 to 1.0.0-rc02n — sureshg/build-commons0 reactions
- Oct 19, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc02n — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Oct 19, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc02 to 1.0.0-rc02n — sureshg/build-commons0 reactions
- Oct 16, 2026Fix generated jars and support publishing KoDEx-processed artifacts — Jolanrensen/KoDEx0 reactions
- Oct 15, 2026chore(deps): update dependency org.jetbrains.kotlinx:dataframe-geo to v1.0.0-rc02n - autoclosed — Kotlin/kotlin-jupyter-libraries0 reactions
- Oct 12, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Oct 7, 2026[KDF] (Attempt 2) Fixed return type mismatch report, like when using `add {}` — JetBrains/kotlin0 reactions · 12 comments
- Oct 5, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Oct 2, 2026[KDF] Fixed return type mismatch report, like when using `add {}` — JetBrains/kotlin0 reactions · 8 comments
- Oct 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/native-image-playground0 reactions · 2 comments
- Sep 28, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Sep 21, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Sep 14, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Sep 11, 2026Bump org.jetbrains.kotlinx:dataframe from 1.0.0-rc01 to 1.0.0-rc01n — linde9821/epa-visualizer0 reactions
- Sep 7, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 31, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 24, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 21, 2026[Feature] Create a preprocessor that adds/creates reference aliases with codespans — Jolanrensen/KoDEx0 reactions
- Aug 10, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 3, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Aug 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/native-image-playground0 reactions · 2 comments
- Jul 27, 2026Bumped built-in dataframe version to 1.0.0-rc01 — JetBrains/kotlin-toolchain0 reactions · 3 comments
- Jul 27, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-rc01 to 1.0.0-rc01n — sureshg/build-commons0 reactions
- Jul 20, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-rc01n — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Jul 20, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jul 13, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jul 6, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jul 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/native-image-playground0 reactions · 2 comments
- Jun 25, 2026Kotlin SWE benchmark contribution — multi-swe-bench/multi-swe-benchsays it tested it0 reactions
- Jun 22, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jun 15, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Jun 15, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-Beta5n — sureshg/build-commons0 reactions
- Jun 8, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10584 — sureshg/kotlin-mpp-playground0 reactions · 2 comments
- Jun 8, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10535 — sureshg/build-commons0 reactions
- Jun 2, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10508 — sureshg/build-commons0 reactions
- Jun 1, 2026build(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10508 — sureshg/native-image-playground0 reactions · 2 comments
- May 25, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10485 — sureshg/build-commons0 reactions
- May 18, 2026chore(deps): bump kotlinx-dataframe from 1.0.0-Beta5 to 1.0.0-dev-10438 — sureshg/build-commons0 reactions
- Oct 29, 2025[K2] TranslatorError: from STATUS to IMPLICIT_TYPES_BODY_RESOLVE — Kotlin/dokka0 reactions · 3 comments
On Bluesky · 1
- May 19, 2025Kotlin DataFrame aims to reconcile Kotlin's static typing with the dynamic nature of data by utilizing both the full power of the Kotlin… — @ytroncal.bsky.social1 likes and repost
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,542 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository24 other files it gives its agents.
- AGENTS.mdAGENTS.md
- core/AGENTS.mdAGENTS.md
- dataframe-compiler-plugin-core/AGENTS.mdAGENTS.md
- dataframe-csv/AGENTS.mdAGENTS.md
- dataframe-excel/AGENTS.mdAGENTS.md
- dataframe-geo/AGENTS.mdAGENTS.md
- dataframe-jdbc/AGENTS.mdAGENTS.md
- dataframe-json/AGENTS.mdAGENTS.md
- examples/AGENTS.mdAGENTS.md
- plugins/AGENTS.mdAGENTS.md
- samples/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- core/CLAUDE.mdCLAUDE.md
- dataframe-arrow/CLAUDE.mdCLAUDE.md
- dataframe-compiler-plugin-core/CLAUDE.mdCLAUDE.md
- dataframe-csv/CLAUDE.mdCLAUDE.md
- dataframe-excel/CLAUDE.mdCLAUDE.md
- dataframe-geo/CLAUDE.mdCLAUDE.md
- dataframe-jdbc/CLAUDE.mdCLAUDE.md
- dataframe-json/CLAUDE.mdCLAUDE.md
- examples/CLAUDE.mdCLAUDE.md
- plugins/CLAUDE.mdCLAUDE.md
- samples/CLAUDE.mdCLAUDE.md
- operation-website-documentationSkill
The file
We split this AGENTS.md into the rules it gives an agent
3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 28
Use the shared "dataframe-arrow tests" run configuration (.idea/runConfigurations/), which passes the flag, or delegate test running to …
- Very specific: line 52
All reads take a NullabilityOptions (default Infer) controlling how column nullability is decided.
- Very specific: line 116
Run just this module: ./gradlew dataframe-arrow:test (add -Pkotlin.dataframe.debug=true to match CI checks).
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
AGENTS.md — dataframe-arrow
Guidance for this module. See the root AGENTS.md for repo-wide build/style/KoDEx rules; only module-specific
details are here.
What this module is
dataframe-arrow (artifact dataframe-arrow, "Apache Arrow support for Kotlin DataFrame"). Reads and writes the two
Apache Arrow IPC formats and reads Parquet:
- Arrow IPC / streaming format —
readArrowIPC/writeArrowIPC. - Arrow random-access / Feather format —
readArrowFeather/writeArrowFeather. - Parquet (read-only) —
readParquet, implemented on top of Arrow Dataset (FileFormat.PARQUET). There is no Parquet writer here.
Depends only on core. Uses the Apache Arrow Java libraries (arrow-vector, arrow-format, arrow-memory, and
arrow-dataset — the last is what enables Parquet) plus commons-compress for in-memory seekable channels.
JVM flag: Arrow uses off-heap memory via java.nio, so the test task passes
--add-opens java.base/java.nio=ALL-UNNAMED (see build.gradle.kts). Downstream users on JDK 16+ need an
equivalent --add-opens at runtime. On a modular classpath (e.g. the examples/projects/spark-parquet-dataframe
example), open to the Arrow module specifically rather than to everything — exactly as that example does:
--add-opens=java.base/java.nio=org.apache.arrow.memory.core,ALL-UNNAMED.
The IntelliJ JUnit runner does not inherit that flag (it lives in tasks.test), so running a plain JUnit
configuration from the gutter fails in every test of this module — not just the Parquet ones — with
UnsupportedOperationException: sun.misc.Unsafe or java.nio.DirectByteBuffer.<init>(long, int) not available.
Use the shared "dataframe-arrow tests" run configuration (.idea/runConfigurations/), which passes the flag,
or delegate test running to Gradle. Switching JDKs does not affect this one.
Parquet needs a native library that some JDK builds fail to load. readParquet goes through Arrow Dataset,
whose JniLoader extracts arrow_dataset_jni into the temp dir and System.loads it. If that fails you get
UnsatisfiedLinkError: … A dynamic link library (DLL) initialization routine failed before any DataFrame code
runs, so every readParquet test fails while all IPC/Feather tests pass — recognize that signature instead of
hunting for a bug in readField. It is not a JDK version boundary and --add-opens does not help; observed on
Windows 10 x64 with Corretto 11 and 21, while JBR 21 and Corretto 25 loaded the same file fine.
The test task inherits the daemon JVM, and gradle/gradle-daemon-jvm.properties pins only the version
(Java 21, any vendor), so switching JAVA_HOME is enough — but stop the daemon first, or the running one
still matches the criteria and is reused (./gradlew --stop, then JAVA_HOME=<jdk> ./gradlew dataframe-arrow:test).
-Dorg.gradle.java.home did not work. Tests that must run everywhere should read IPC/Feather rather than Parquet —
ArrowTimestampTzTest keeps a Feather twin of its Parquet fixture, from the same PyArrow script, for this reason.
Public API surface (src/main/kotlin/.../io/)
arrowReading.kt— reading entry points, allDataFrame.Companionextensions:readArrowIPC(...)andreadArrowFeather(...), each overloaded forFile/Path/String/URL/InputStream/ByteArray/ channel.readArrow(reader: ArrowReader)andArrowReader.toDataFrame()— read any Arrow stream from an existing reader.readParquet(vararg ...)forURL/String/Path/File, withbatchSize(defaultARROW_PARQUET_DEFAULT_BATCH_SIZE = 32768).- All reads take a
NullabilityOptions(defaultInfer) controlling how column nullability is decided.
arrowWriting.kt—AnyFramewrite extensions:writeArrowIPC/writeArrowFeather(to channel / stream /File/Path),saveArrowIPCToByteArray/saveArrowFeatherToByteArray, andAnyFrame.arrowWriter(...).ArrowWriter.kt— theArrowWriterinterface (AutoCloseable) that writing delegates to. Key concepts:Mode—restrictWidening/restrictNarrowing/strictType/strictNullable, with presetsMode.STRICTandMode.LOYAL. Controls how the frame is coerced to a target ArrowSchema.ConvertingMismatchsubscriber —ignoreMismatchMessage/writeMismatchMessage/logMismatchMessagehandle schema/type mismatches during writing.
Implementation is in arrowReadingImpl.kt, ArrowWriterImpl.kt, and arrowTypesMatching.kt (Arrow ↔ Kotlin type
mapping); ConvertingMismatch.kt defines the mismatch model. Follow the api → impl split when editing.
Never convert a date-time column with core's plain convertTo/convertToLocalDateTime in the writer. They
resolve against the JVM default time zone, so the output would depend on the machine. Arrow and Parquet define a
timestamp as an offset from 1970-01-01T00:00:00Z, so ArrowWriterImpl routes these conversions through its own
convertToInstantInUtc / convertToLocalDateTimeInUtc, which pin UTC for every source that needs a zone
(local date-times, dates, and numbers read as epoch millis). Guarded by
ArrowTimestampTzTest.writing does not depend on the default time zone, which writes one column of each under
four shifted default zones. The core-side root cause is tracked as
#2072 — if it is fixed there with a UTC default, these two
local helpers become redundant. The Date(DAY) and Time(unit) branches are not pinned yet: same bug, only
reachable with an explicit target Schema.
Every write failure goes through the ConvertingMismatch subscriber. A value the target field cannot hold is
reported to mismatchSubscriber and then either refused as a ConvertingException (in a strict Mode) or
degraded and written anyway (in a loyal one) — never thrown past the subscriber as a bare exception, which
Mode.LOYAL callers cannot catch by the documented type. This holds for out-of-range timestamps
(ConvertingMismatch.ValueOutOfRange, gated on mode.strictType) as it does for the older type/nullability
mismatches. Note Mode.STRICT is the default of arrowWriter(targetSchema, …), and the only mode the no-schema
writeArrow*/saveArrow*ToByteArray path uses. A degraded form has to be legal for the target field: a value
dropped to null needs a nullable vector (the field is only widened to nullable when the source column has
nulls), so into a non-nullable one an out-of-range value is refused in either mode — writing it would emit a file
that NullabilityOptions.Checking then refuses to read back.
One known gap in that contract: a ColumnGroup's columns are converted inside infillVector, outside the
try/catch that gates conversion failures on the mode — so a nested column that cannot be converted throws
CellConversionException past the subscriber and aborts the whole write even in Mode.LOYAL. Pre-existing and
not timestamp-specific (any child vector does it, e.g. is IntVector -> column.convertToInt()); tracked as
#2075.
Three more writer invariants, with a test each:
an instant at the bottom of the target unit round-trips— theLong.MIN_VALUEboundary of a timestamp unit is representable and must not be rejected as out of range.a write that fails leaves no leaked buffers behind(plus… with an Error …) — a vector is allocated before it is filled, so any throw in between must close it, and every vector allocated for an earlier field must be closed too, orRootAllocator.close()reports a leak and masks the real error. Both cleanups catchThrowable, notException: an unsupported target field arrives asNotImplementedError.a frame column has no list mapping on write— the writer implements no list vectors, so aFrameColumnis not writable: a top-level one degrades toUtf8, a nested one fails on allocation.
The Arrow ↔ Kotlin type mapping is published as a table in docs/StardustDocs/topics/dataSources/ApacheArrow.md
and pinned by ArrowTypeMappingTest; change the code, the test and the table in the same commit. The read and
write tables are not symmetric — reading builds lists and frame columns, writing has no list mapping at all.
Legacy/deprecated: arrowReading.kt also defines ArrowFeather, an implementation of the old
SupportedDataFrameFormat SPI registered in
src/main/resources/META-INF/services/org.jetbrains.kotlinx.dataframe.io.SupportedFormat. That SPI is deprecated
(ERROR level, removed in 1.0) — don't build on it; the read*/write* extension functions are the real API.
Tests
- Tests live under
src/test/kotlin/.../io/; fixtures insrc/test/resources/.duckdb-jdbcandarrow-c-dataare test-only deps (DuckDB is used to produce Parquet/Arrow test data). - Run just this module:
./gradlew dataframe-arrow:test(add-Pkotlin.dataframe.debug=trueto match CI checks).
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

