.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at

..   http://www.apache.org/licenses/LICENSE-2.0

.. Unless required by applicable law or agreed to in writing,
.. software distributed under the License is distributed on an
.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
.. KIND, either express or implied.  See the License for the
.. specific language governing permissions and limitations
.. under the License.

.. java arrow documentation master file, created by
   sphinx-quickstart on Wed Jan 19 08:34:06 2022.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Apache Arrow Java Cookbook
==========================

The Apache Arrow Cookbook is a collection of recipes which demonstrate how to solve many common tasks that users might need to perform when working with Arrow data. The examples in this cookbook will also serve as robust and well performing solutions to those tasks.

To get started with Apache Arrow in Java, see the
`Installation Instructions <https://arrow.apache.org/docs/java/install.html>`_.

This cookbook is tested with Apache Arrow |version|.

.. toctree::
   :maxdepth: 2
   :caption: Contents:

   create
   schema
   io
   flight
   dataset
   substrait
   data
   avro
   jdbc

Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
