Read Avro and Feather Files Without Writing a Line of Python
Avro is what data pipelines write: Kafka topics landed in storage, Spark and Hive jobs, BigQuery exports. Feather is what pandas and R users hand each other. Both are binary, both carry their own schema, and looking inside either one usually starts with a script. This is how to read them — and join one to the other — with no code at all.
Two Formats, Two Jobs
| Avro | Feather | |
|---|---|---|
| Layout | Row by row, in blocks that may be compressed | Column by column: Apache Arrow’s file format |
| Schema | Written into the file’s header | Written into the file, as Arrow types |
| Usually comes from | Kafka connectors, Spark, Hive, BigQuery exports | pandas, R and other Arrow tools |
| Extensions | .avro | .feather, .arrow, .ipc; .arrows for the stream form |
Neither opens in Excel or a text editor, and the usual fix — a few lines of Python with fastavro or pyarrow — assumes Python is there and that you want to write it.
Doing It in the Browser
OmniSelect FileSQL reads Avro with a Rust reader compiled to WebAssembly, and Feather with the Apache Arrow library — compressed Feather files included — both inside your browser tab and both served from this site. Nothing is uploaded.
- Open the app.
- Drop the files onto the File Select panel. Each becomes a table named by the first letter of its file name, shown in the Alias column:
events.avroisE,products.featherisP. - Look at the Avro file.
SELECT * FROM E LIMIT 100
| event_id | ts | kind | sku | id | country |
|---|---|---|---|---|---|
| e1 | 2026-06-01T09:00:00.000Z | VIEW | SKU-100 | u1 | GB |
| e2 | 2026-06-01T09:17:00.000Z | CART | SKU-100 | u1 | GB |
| e3 | 2026-06-01T09:34:00.000Z | PURCHASE | SKU-100 | u1 | GB |
| e4 | 2026-06-01T09:51:00.000Z | VIEW | SKU-200 | u2 | |
| e5 | 2026-06-01T10:08:00.000Z | VIEW | SKU-300 | u3 | DE |
The schema has been applied for you:
- The nested
userrecord is flattened into columns.user.idanduser.countryappear asidandcountry, with the full path shown under each header, and can be queried by either the short name or the path with an underscore:countryoruser_country. tsis atimestamp-millisin the schema and arrives as a timestamp, not a count of milliseconds.kindis an Avro enum and arrives as its text.countryis a union with null, and evente4’s is null: an empty cell, whichWHERE user_country IS NULLfinds.
Ask It Questions
Type a question into the plain-English box and the SQL is written inside your browser, with no AI service. count of events by kind becomes:
SELECT kind, COUNT(*) AS count_events FROM E GROUP BY kind
| kind | count_events |
|---|---|
| VIEW | 5 |
| CART | 2 |
| PURCHASE | 3 |
And number of purchases by sku knows that purchases is a value of kind:
SELECT sku, COUNT(*) AS count_rows FROM E WHERE kind = 'PURCHASE' GROUP BY sku
Joining Avro to Feather
The Feather file is the product list, SELECT * FROM P:
| sku | product | price |
|---|---|---|
| SKU-100 | Trail shoe | 89 |
| SKU-200 | Rain jacket | 129 |
| SKU-300 | Day pack | 54.5 |
Two formats, one query — purchases and revenue per product:
SELECT P.product, COUNT(*) AS purchases, SUM(P.price) AS revenue FROM E JOIN P ON E.sku = P.sku WHERE E.kind = 'PURCHASE' GROUP BY P.product ORDER BY revenue DESC
| product | purchases | revenue |
|---|---|---|
| Rain jacket | 1 | 129 |
| Trail shoe | 1 | 89 |
| Day pack | 1 | 54.5 |
Drop an .avro or .feather file in and see inside it.
Open the app →Compressed Feather Files
pyarrow compresses Feather files with LZ4 unless told otherwise, and offers ZSTD as well; R’s arrow package also compresses by default. The Arrow library in the browser cannot decompress either, so the app unpacks each compressed part itself, inside the tab, before Arrow reads the file. You do nothing different: a file straight out of df.to_feather('orders.feather') opens as it is.
Two things are refused, each with a message saying why:
- A file that unpacks to more than 200 MB. The file itself can be up to 50 MB, and compression can hide far more than that, so the sizes a file declares are checked before anything is unpacked.
- The original Feather format, version 1. Saving it again from a current pandas or pyarrow writes version 2, which opens here — or save it as Parquet, which reads here too: see opening a Parquet file offline.
pd.read_feather('old.feather').to_feather('new.feather')
What Else to Know About Avro
- Codecs. Uncompressed, deflate and snappy files are read — snappy is the usual one from Kafka, Spark and Hadoop. A file compressed with any other codec is refused with a message naming the codec.
- Container files only. The file must be an Avro container file, which starts with the Avro header and carries its schema. Single Kafka messages framed for a schema registry are not files of that kind, and are refused.
- Large numbers stay exact. A
longtoo large to hold exactly as a JavaScript number is kept as text rather than rounded. - Size. Up to 50 MB per file, and up to 200 MB once its blocks are unpacked. Snappy and deflate blocks are unpacked inside the tab, and a file that claims more is refused rather than left to fill your memory.
Converting
Run a query, open the Export menu and choose CSV, Excel, JSON or Parquet. The export is the result, so a WHERE and a column list in front of it convert only what you need — and every row of the result is written, not just those on screen. Avro to Parquet is a common one: the columns keep their types.
Reasonable Questions
Do I need the schema file (.avsc)?
No. An Avro container file carries its own schema in its header, and that is what is used.
What happens to arrays and nested records?
Nested records become columns named by their path, as above. Nested data is flattened the same way as JSON — see one query across seven file formats.
Can I write Avro or Feather?
No. Exports are CSV, JSON, Excel or Parquet.
Does anything leave my machine?
No. Both readers run in the tab, and after the page has loaded it makes no network requests — here is how to check.