Beyond “Just a File”: A Data Engineer’s Perspective

As a data engineer, the smallest “unit of data” you work with is generally either a file or a database table. Even in the age of real-time streaming, files remain one of the most convenient and reliable ways to exchange data between systems. Whether in traditional ETL or modern data engineering, they show up as:

  • Input datasets
  • Intermediate artifacts
  • Final outputs

But beyond being “just a file,” the way data is structured and stored — its storage format — directly affects how efficiently it can be read, processed, and moved through a pipeline.

A map of file types

Zoom out and the formats fall into a fairly clean taxonomy — split first by whether a file is plain text, then by how the data inside is structured:

graph TD
    F["File"]
    F --> PT["Plain-Text File"]
    F --> NPT["not Plain-Text File"]

    PT --> PTQ["How is the data<br/>structured within the file?"]
    PTQ --> SS["Semi-Structured-Data File"]
    PTQ --> ST["Structured-Data /<br/>Tabular-Data File"]
    PTQ --> UT["Unstructured-Data File"]

    SS --> JSON["JSON"]
    SS --> XML["XML"]

    ST --> FL["Fixed-Length /<br/>Fixed-Width File"]
    ST --> VL["Variable-Length /<br/>Variable-Width File"]
    VL --> DEL["Delimited File"]
    VL --> BOTH["File with both fixed-length<br/>and delimited fields"]
    DEL --> CSV["CSV (Comma-Separated Values)"]
    DEL --> TSV["TSV (Tab-Separated Values)"]
    DEL --> PSV["PSV (Pipe-Separated Values)"]
    DEL --> SOH["0x01 (SOH) delimited"]
    DEL --> NUL["0x00 (NUL) delimited"]

    UT --> LOG["free-form text file<br/>e.g. log file"]

    NPT --> NPQ["How is the data<br/>structured within the file?"]
    NPQ --> ST2["Structured-Data File"]
    NPQ --> UT2["Unstructured-Data File"]

    ST2 --> LP["Length-Prefixed File"]
    ST2 --> COB["COBOL Data File"]
    ST2 --> XLS["Excel File (.xls / .xlsx)"]
    ST2 --> PAR["Apache Parquet"]
    ST2 --> AVRO["Apache Avro"]
    ST2 --> ORC["Apache ORC"]

    UT2 --> RICH["Rich-Formatted text file<br/>(.docx / .rtf / .pdf)"]

    classDef fmt fill:#5f4b9b,stroke:#4a3a7a,color:#ffffff;
    class JSON,XML,FL,BOTH,CSV,TSV,PSV,SOH,NUL,LOG,LP,COB,XLS,PAR,AVRO,ORC,RICH fmt;

The purple nodes are concrete formats; the rest are the categories they fall under.

Traditional ETL file types

In legacy settings, you’ll frequently encounter:

  • Delimited text files — CSV, PSV, and even \x01 (SOH) delimiters.
  • Fixed-length / fixed-width files — remember the old debate: fixed-length vs. delimited?
  • Length-prefixed files.
  • COBOL data files.
  • Mixed-field files — a complex blend of fixed-length, variable-length, and binary numeric fields.

Modern data engineering standards

In modern stacks, the focus shifts toward optimisation and scale:

  • CSV — the universal “language” of data exchange.
  • Apache Parquet — the backbone of modern architectures (data lakes / lakehouses) and a Spark favourite, thanks to its columnar storage efficiency.

Why it matters

Understanding these formats is the difference between a pipeline that just “runs” and one that is truly optimised for performance.


Originally published on LinkedIn — feel free to read and react to it there too.