Apache Hive (TM) @VERSION@
======================

The Apache Hive (TM) data warehouse software facilitates querying and
managing large datasets residing in distributed storage. Built on top
of Apache Hadoop (TM), it provides:

* Tools to enable easy data extract/transform/load (ETL)

* A mechanism to impose structure on a variety of data formats

* Access to files stored either directly in Apache HDFS (TM) or in other
  data storage systems such as Apache HBase (TM)

* Query execution using Apache Hadoop MapReduce or Apache Tez
  frameworks.

Hive implements a dialect of SQL (Hive QL) that focuses on analytics
and presents a rich set of SQL semantics including OLAP functions,
subqueries, common table expressions and more. Hive allows SQL
developers or users with SQL tools to easily query, analyze and
process data stored in Hadoop.
Hive also allows programmers familiar with the MapReduce framework
to plug in their custom mappers and reducers to perform more
sophisticated analysis that may not be supported by the built-in
capabilities of the language. QL can also be extended with custom
scalar functions (UDF's), aggregations (UDAF's), and table
functions (UDTF's).

Hive users have a choice of 2 runtimes when executing SQL queries.
Users can choose to use the Apache Hadoop MapReduce framework,
which is mature and proven at large scales. MapReduce is a purely
batch framework, and queries run using the MapReduce framework
may experience higher latencies (tens of seconds), even
over small datasets. Alternatively, users can choose to use the
newer Apache Tez framework to process SQL queries. Tez is
designed for interactive query and has substantially reduced
overheads versus MapReduce. Users are free to switch back and
forth between these frameworks at any time. In either case,
Hive is best suited for use cases where the amount of data
processed is large enough to require a distributed system.

Hive is not designed for online transaction processing and does
not support row level insert/updates. It is best used for batch
jobs over large sets of immutable data (like web logs). What
Hive values most are scalability (scale out with more machines
added dynamically to the Hadoop cluster), extensibility (with
MapReduce framework and UDF/UDAF/UDTF), fault-tolerance, and
loose-coupling with its input formats.


General Info
============

For the latest information about Hive, please visit out website at:

  http://hive.apache.org/


Getting Started
===============

- Installation Instructions and a quick tutorial:
  https://cwiki.apache.org/confluence/display/Hive/GettingStarted

- A longer tutorial that covers more features of HiveQL:
  https://cwiki.apache.org/confluence/display/Hive/Tutorial

- The HiveQL Language Manual:
  https://cwiki.apache.org/confluence/display/Hive/LanguageManual


Requirements
============

- Java 1.6, 1.7

- Hadoop 1.x, 2.x


Upgrading from older versions of Hive
=====================================

- Hive @VERSION@ includes changes to the MetaStore schema. If
  you are upgrading from an earlier version of Hive it is imperative
  that you upgrade the MetaStore schema by running the appropriate
  schema upgrade scripts located in the scripts/metastore/upgrade
  directory.

- We have provided upgrade scripts for MySQL, PostgreSQL, Oracle,
  Microsoft SQL Server, and Derby databases. If you are using a
  different database for your MetaStore you will need to provide
  your own upgrade script.

Useful mailing lists
====================

1. user@hive.apache.org - To discuss and ask usage questions. Send an
   empty email to user-subscribe@hive.apache.org in order to subscribe
   to this mailing list.

2. dev@hive.apache.org - For discussions about code, design and features.
   Send an empty email to dev-subscribe@hive.apache.org in order to
   subscribe to this mailing list.

3. commits@hive.apache.org - In order to monitor commits to the source
   repository. Send an empty email to commits-subscribe@hive.apache.org
   in order to subscribe to this mailing list.
