private static ParquetDataColumnReader getConvertorFromBinary(boolean isDict,
                                                                PrimitiveType parquetType,
                                                                TypeInfo hiveType,
                                                                ValuesReader valuesReader,
                                                                Dictionary dictionary) {
    LogicalTypeAnnotation logicalType = parquetType.getLogicalTypeAnnotation();

    // max length for varchar and char cases
    int length = getVarcharLength(hiveType);
    TypeInfo realHiveType = (hiveType instanceof ListTypeInfo) ?
        ((ListTypeInfo) hiveType).getListElementTypeInfo() :
        (hiveType instanceof MapTypeInfo) ?
            ((MapTypeInfo) hiveType).getMapValueTypeInfo() : hiveType;

    String typeName = TypeInfoUtils.getBaseName(realHiveType.getTypeName());

    int hivePrecision = (typeName.equalsIgnoreCase(serdeConstants.DECIMAL_TYPE_NAME)) ?
        ((DecimalTypeInfo) realHiveType).getPrecision() : 0;
    int hiveScale = (typeName.equalsIgnoreCase(serdeConstants.DECIMAL_TYPE_NAME)) ?
        ((DecimalTypeInfo) realHiveType).getScale() : 0;

    if (logicalType == null) {
      return isDict ? new DefaultParquetDataColumnReader(dictionary, length) : new
          DefaultParquetDataColumnReader(valuesReader, length);
    }

    Optional<ParquetDataColumnReader> reader = parquetType.getLogicalTypeAnnotation()
        .accept(new LogicalTypeAnnotationVisitor<ParquetDataColumnReader>() {
          @Override public Optional<ParquetDataColumnReader> visit(
              DecimalLogicalTypeAnnotation logicalTypeAnnotation) {
            final short scale = (short) logicalTypeAnnotation.getScale();
            return isDict ? Optional
                .of(new TypesFromDecimalPageReader(dictionary, length, scale, hivePrecision,
                    hiveScale)) : Optional
                .of(new TypesFromDecimalPageReader(valuesReader, length, scale, hivePrecision,
                    hiveScale));
          }

          @Override public Optional<ParquetDataColumnReader> visit(
              StringLogicalTypeAnnotation logicalTypeAnnotation) {
            return isDict ? Optional
                .of(new TypesFromStringPageReader(dictionary, length)) : Optional
                .of(new TypesFromStringPageReader(valuesReader, length));
          }
        });

    if (reader.isPresent()) {
      return reader.get();
    }

    return isDict ? new DefaultParquetDataColumnReader(dictionary, length) : new
      DefaultParquetDataColumnReader(valuesReader, length);
  }
The reader who reads from the underlying UTF8 string.
ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/ParquetDataColumnReaderFactory.java