<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <title>ORC Specification</title>
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <meta name="generator" content="Jekyll v4.4.1">
  <link rel="stylesheet" href="//fonts.googleapis.com/css?family=Lato:300,300italic,400,400italic,700,700italic,900">
  <link rel="stylesheet" href="/css/screen.css">
  <link rel="icon" type="image/x-icon" href="/favicon.ico">
  <!--[if lt IE 9]>
  <script src="/js/html5shiv.min.js"></script>
  <script src="/js/respond.min.js"></script>
  <![endif]-->
  <!-- Matomo -->
  <script>
    var _paq = window._paq = window._paq || [];
    /* tracker methods like "setCustomDimension" should be called before "trackPageView" */
    _paq.push(["setDoNotTrack", true]);
    _paq.push(["disableCookies"]);
    _paq.push(['trackPageView']);
    _paq.push(['enableLinkTracking']);
    (function() {
      var u="https://analytics.apache.org/";
      _paq.push(['setTrackerUrl', u+'matomo.php']);
      _paq.push(['setSiteId', '68']);
      var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
      g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
    })();
  </script>
  <!-- End Matomo Code -->
</head>


<body class="wrap">
  <header role="banner">
  <nav class="mobile-nav show-on-mobiles">
    <ul>
  <li class="">
    <a href="/">Home</a>
  </li>
  <li class="">
    <a href="/releases/"><span class="show-on-mobiles">Rel</span>
                         <span class="hide-on-mobiles">Releases</span></a>
  </li>
  <li class="">
    <a href="/docs/"><span class="show-on-mobiles">Doc</span>
                     <span class="hide-on-mobiles">Documentation</span></a>
  </li>
  <li class="">
    <a href="/talks/"><span class="show-on-mobiles">Talk</span>
                      <span class="hide-on-mobiles">Talks</span></a>
  </li>
  <li class="">
    <a href="/news/">News</a>
  </li>
  <li class="">
    <a href="/develop/"><span class="show-on-mobiles">Dev</span>
                        <span class="hide-on-mobiles">Develop</span></a>
  </li>
  <li class="">
    <a href="/help/">Help</a>
  </li>
</ul>

  </nav>
  <div class="grid">
    <div class="unit one-quarter center-on-mobiles">
      <h1>
        <a href="/">
          <span class="sr-only">Apache ORC</span>
          <img src="/img/logo.png" width="249" height="101" alt="ORC Logo">
        </a>
      </h1>
    </div>
    <nav class="main-nav unit three-quarters hide-on-mobiles">
      <ul>
  <li class="">
    <a href="/">Home</a>
  </li>
  <li class="">
    <a href="/releases/"><span class="show-on-mobiles">Rel</span>
                         <span class="hide-on-mobiles">Releases</span></a>
  </li>
  <li class="">
    <a href="/docs/"><span class="show-on-mobiles">Doc</span>
                     <span class="hide-on-mobiles">Documentation</span></a>
  </li>
  <li class="">
    <a href="/talks/"><span class="show-on-mobiles">Talk</span>
                      <span class="hide-on-mobiles">Talks</span></a>
  </li>
  <li class="">
    <a href="/news/">News</a>
  </li>
  <li class="">
    <a href="/develop/"><span class="show-on-mobiles">Dev</span>
                        <span class="hide-on-mobiles">Develop</span></a>
  </li>
  <li class="">
    <a href="/help/">Help</a>
  </li>
</ul>

    </nav>
  </div>
</header>


  <section class="standalone">
  <div class="grid">

    <div class="unit whole">
      <article>
        <h1>ORC Specification</h1>
        <p>There have been two released ORC file versions:</p>

<ul>
  <li><a href="ORCv0">ORC v0</a> was released in Hive 0.11.</li>
  <li><a href="ORCv1">ORC v1</a> was released in Hive 0.12 and ORC 1.x.</li>
</ul>

<p>Each version of the library will detect the format version and use
the appropriate reader. The library can also write the older versions
of the file format to ensure that users can write files that all of their
clusters can read correctly.</p>

<p>We are working on a new version of the file format:</p>

<ul>
  <li><a href="ORCv2">ORC v2</a> is a work in progress and is rapidly evolving.</li>
</ul>

      </article>
    </div>

    <div class="clear"></div>

  </div>
</section>


  <footer role="contentinfo">
  <p style="margin-left: 20px; margin-right; 20px; text-align: center">The contents of this website are &copy;&nbsp;2026
     <a href="https://www.apache.org/">Apache Software Foundation</a>
     under the terms of the <a
      href="https://www.apache.org/licenses/LICENSE-2.0.html">
      Apache&nbsp;License&nbsp;v2</a>. Apache ORC and its logo are trademarks
      of the Apache Software Foundation.</p>
</footer>

  <script>
  var anchorForId = function (id) {
    var anchor = document.createElement("a");
    anchor.className = "header-link";
    anchor.href      = "#" + id;
    anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
    anchor.title = "Permalink";
    return anchor;
  };

  var linkifyAnchors = function (level, containingElement) {
    var headers = containingElement.getElementsByTagName("h" + level);
    for (var h = 0; h < headers.length; h++) {
      var header = headers[h];

      if (typeof header.id !== "undefined" && header.id !== "") {
        header.appendChild(anchorForId(header.id));
      }
    }
  };

  document.onreadystatechange = function () {
    if (this.readyState === "complete") {
      var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
      if (!contentBlock) {
        return;
      }
      for (var level = 1; level <= 6; level++) {
        linkifyAnchors(level, contentBlock);
      }
    }
  };
</script>


</body>
</html>
