PARQUET-123: Enable dictionary support in AvroIndexedRecordConverter

If consumers are loading Parquet records into an immutable structure
like an Apache Spark RDD, being able to configure string reuse in
AvroIndexedRecordConverter can drastically reduce the overall memory
footprint of strings.

NOTE: This isn't meant to be a merge-able PR (yet). I want to use
this PR as a way to discuss: (1) if this is a reasonable approach
and (2) to learn if PrimitiveConverter needs to be thread-safe as
I'm currently using a ConcurrentHashMap. If there's agreement
that this would be worthwhile, I'll create a JIRA and write some
unit tests.

Author: Matt Massie <massie@cs.berkeley.edu>

Closes #76 from massie/immutable-strings and squashes the following commits:

88ce5bf [Matt Massie] PARQUET-123: Enable dictionary support in AvroIndexedRecordConverter
PARQUET-121: Allow Parquet to build with Java 8

There are test failures running with Java 8 due to http://openjdk.java.net/jeps/180 which changed retrieval order for HashMap.

Here's how I tested this:

```bash
use-java8
mvn clean install -DskipTests -Dmaven.javadoc.skip=true
mvn test
mvn test -P hadoop-2
```

I also compiled the main code with Java 7 (target=1.6 bytecode), and compiled the tests with Java 8, and ran them with Java 8. The idea here is to simulate users who want to run Parquet with JRE 8.
```bash
use-java7
mvn clean install -DskipTests -Dmaven.javadoc.skip=true
use-java8
find . -name test-classes | grep target/test-classes | grep -v 'parquet-scrooge' | xargs rm -rf
mvn test -DtargetJavaVersion=1.8 -Dmaven.main.skip=true -Dscala.maven.test.skip=true
```
A couple of notes about this:
* The targetJavaVersion property is used since other Hadoop projects use the same name.
* I couldn’t get parquet-scrooge to compile with target=1.8, which is why I introduced scala.maven.test.skip (and updated scala-maven-plugin to the latest version which supports the property). Compiling with target=1.8 should be fixed in another JIRA as it looks pretty involved.

Author: Tom White <tom@cloudera.com>

Closes #77 from tomwhite/PARQUET-121-java8 and squashes the following commits:

8717e13 [Tom White] Fix tests to run under Java 8.
35ea670 [Tom White] PARQUET-121. Allow Parquet to build with Java 8.
PARQUET-122: make task side metadata true by default

Author: julien <julien@twitter.com>

Closes #78 from julienledem/task_side_metadata_default_true and squashes the following commits:

32451a7 [julien] make task side metadata true by default
PARQUET-135: Input location is not getting set for the getStatistics in ParquetLoader when using two different loaders within a Pig script.

Author: elif dede <edede@twitter.com>

Closes #86 from elifdd/parquetLoader_error_PARQUET-135 and squashes the following commits:

b0150ee [elif dede] fixed white space
bdb381a [elif dede] PARQUET-135: Call setInput from getStatistics in ParquetLoader to fix ReduceEstimator errors in pig jobs
PARQUET-132: Add type parameter to AvroParquetInputFormat.

Author: Ryan Blue <blue@apache.org>

Closes #84 from rdblue/PARQUET-132-parameterize-avro-inputformat and squashes the following commits:

63114b0 [Ryan Blue] PARQUET-132: Add type parameter to AvroParquetInputFormat.
PARQUET-114: Sample NanoTime class serializes and deserializes Timestamp incorrectly

I ran the Parquet Column tests and they passed.

FYI @rdblue

Author: Brock Noland <brock@apache.org>

Closes #71 from brockn/master and squashes the following commits:

69ba484 [Brock Noland] PARQUET-114 - Sample NanoTime class serializes and deserializes Timestamp incorrectly
PARQUET-52: refactor fallback mechanism

See: https://issues.apache.org/jira/browse/PARQUET-52
Context:
In the ValuesWriter API there is a mechanism to return the Encoding actually used which allows to fallback to a different encoding.
For example the dictionary encoding may fail if there are too many distinct values and the dictionary grows too big. In such cases the DictionaryValuesWriter was falling back to the Plain encoding.
This can happen as well if the space savings are not satisfying when writing the first page and we prefer to fallback to a more light weight encoding.
With Parquet 2.0 we are adding new encodings and the fall back is not necessarily Plain anymore.
This Pull Request decouple the fallback mechanism from Dictionary and Plain encodings and allows to reuse the fallback logic with other encodings.
One could imagine more than one level of fallback in the future by chaining the FallBackValuesWriter.

Author: julien <julien@twitter.com>

Closes #74 from julienledem/fallback and squashes the following commits:

b74a4ca [julien] Merge branch 'master' into fallback
d9abd62 [julien] better naming
aa90caf [julien] exclude values encoding from SemVer
10f295e [julien] better test setup
c516bd9 [julien] improve test
780c4c3 [julien] license header
f16311a [julien] javadoc
aeb8084 [julien] add more test; fix dic decoding
0793399 [julien] Merge branch 'master' into fallback
2638ec9 [julien] fix dictionary encoding labelling
2fd9372 [julien] consistent naming
cf7a734 [julien] rewrite ParquetProperties to enable proper fallback
bf1474a [julien] refactor fallback mechanism
PARQUET-140: Allow clients to control the GenericData instance used to read Avro records

Author: Josh Wills <jwills@cloudera.com>

Closes #90 from jwills/master and squashes the following commits:

044cf54 [Josh Wills] PARQUET-140: Allow clients to control the GenericData object that is used to read Avro records
Merge remote branch 'upstream/master'