You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ra...@apache.org on 2019/07/03 01:38:27 UTC

[arrow] branch master updated: ARROW-5483: [Java] add ValueVector constructors that take Field object

This is an automated email from the ASF dual-hosted git repository.

ravindra pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new 913d82d  ARROW-5483: [Java] add ValueVector constructors that take Field object
913d82d is described below

commit 913d82d1c21d35d438fc01081dcace901f4def02
Author: Pindikura Ravindra <ra...@dremio.com>
AuthorDate: Wed Jul 3 07:08:06 2019 +0530

    ARROW-5483: [Java] add ValueVector constructors that take Field object
    
    Author: Pindikura Ravindra <ra...@dremio.com>
    
    Closes #4614 from pravindra/vecopt and squashes the following commits:
    
    581399266 <Pindikura Ravindra> ARROW-5483: add ValueVector constructors that take Field object
---
 .../src/main/codegen/templates/UnionVector.java    |   9 +-
 .../apache/arrow/vector/BaseFixedWidthVector.java  |  18 +-
 .../org/apache/arrow/vector/BaseValueVector.java   |  10 +-
 .../arrow/vector/BaseVariableWidthVector.java      |  18 +-
 .../java/org/apache/arrow/vector/BigIntVector.java |  14 +-
 .../java/org/apache/arrow/vector/BitVector.java    |  14 +-
 .../org/apache/arrow/vector/DateDayVector.java     |  14 +-
 .../org/apache/arrow/vector/DateMilliVector.java   |  14 +-
 .../org/apache/arrow/vector/DecimalVector.java     |  16 +-
 .../org/apache/arrow/vector/DurationVector.java    |  17 +-
 .../apache/arrow/vector/ExtensionTypeVector.java   |  25 ++-
 .../apache/arrow/vector/FixedSizeBinaryVector.java |  16 +-
 .../java/org/apache/arrow/vector/Float4Vector.java |  14 +-
 .../java/org/apache/arrow/vector/Float8Vector.java |  14 +-
 .../java/org/apache/arrow/vector/IntVector.java    |  14 +-
 .../org/apache/arrow/vector/IntervalDayVector.java |  14 +-
 .../apache/arrow/vector/IntervalYearVector.java    |  14 +-
 .../org/apache/arrow/vector/SmallIntVector.java    |  14 +-
 .../org/apache/arrow/vector/TimeMicroVector.java   |  14 +-
 .../org/apache/arrow/vector/TimeMilliVector.java   |  14 +-
 .../org/apache/arrow/vector/TimeNanoVector.java    |  14 +-
 .../org/apache/arrow/vector/TimeSecVector.java     |  14 +-
 .../arrow/vector/TimeStampMicroTZVector.java       |  15 ++
 .../apache/arrow/vector/TimeStampMicroVector.java  |  13 ++
 .../arrow/vector/TimeStampMilliTZVector.java       |  15 ++
 .../apache/arrow/vector/TimeStampMilliVector.java  |  13 ++
 .../apache/arrow/vector/TimeStampNanoTZVector.java |  15 ++
 .../apache/arrow/vector/TimeStampNanoVector.java   |  13 ++
 .../apache/arrow/vector/TimeStampSecTZVector.java  |  15 ++
 .../apache/arrow/vector/TimeStampSecVector.java    |  13 ++
 .../org/apache/arrow/vector/TimeStampVector.java   |  14 +-
 .../org/apache/arrow/vector/TinyIntVector.java     |  14 +-
 .../java/org/apache/arrow/vector/UInt1Vector.java  |   7 +-
 .../java/org/apache/arrow/vector/UInt2Vector.java  |   7 +-
 .../java/org/apache/arrow/vector/UInt4Vector.java  |   7 +-
 .../java/org/apache/arrow/vector/UInt8Vector.java  |   7 +-
 .../org/apache/arrow/vector/VarBinaryVector.java   |  14 +-
 .../org/apache/arrow/vector/VarCharVector.java     |  14 +-
 .../vector/complex/BaseRepeatedValueVector.java    |   9 +-
 .../arrow/vector/complex/FixedSizeListVector.java  |   9 +-
 .../apache/arrow/vector/complex/ListVector.java    |   2 +-
 .../java/org/apache/arrow/vector/types/Types.java  | 213 +++++++++------------
 .../org/apache/arrow/vector/types/pojo/Field.java  |   2 +-
 .../apache/arrow/vector/types/pojo/FieldType.java  |   5 +
 .../org/apache/arrow/vector/TestVectorAlloc.java   | 106 ++++++++++
 45 files changed, 689 insertions(+), 178 deletions(-)

diff --git a/java/vector/src/main/codegen/templates/UnionVector.java b/java/vector/src/main/codegen/templates/UnionVector.java
index 26f4673..04eed72 100644
--- a/java/vector/src/main/codegen/templates/UnionVector.java
+++ b/java/vector/src/main/codegen/templates/UnionVector.java
@@ -17,6 +17,7 @@
 
 import io.netty.buffer.ArrowBuf;
 import org.apache.arrow.memory.ReferenceManager;
+import org.apache.arrow.vector.types.pojo.FieldType;
 
 <@pp.dropOutputFile />
 <@pp.changeOutputFile name="/org/apache/arrow/vector/complex/UnionVector.java" />
@@ -74,14 +75,18 @@ public class UnionVector implements FieldVector {
   private int singleType = 0;
   private ValueVector singleVector;
 
-  private static final byte TYPE_WIDTH = 1;
   private final CallBack callBack;
   private int typeBufferAllocationSizeInBytes;
 
+  private static final byte TYPE_WIDTH = 1;
+  private static final FieldType INTERNAL_STRUCT_TYPE = new FieldType(false /*nullable*/,
+      ArrowType.Struct.INSTANCE, null /*dictionary*/, null /*metadata*/);
+
   public UnionVector(String name, BufferAllocator allocator, CallBack callBack) {
     this.name = name;
     this.allocator = allocator;
-    this.internalStruct = new NonNullableStructVector("internal", allocator, new FieldType(false, ArrowType.Struct.INSTANCE, null, null), callBack);
+    this.internalStruct = new NonNullableStructVector("internal", allocator, INTERNAL_STRUCT_TYPE,
+        callBack);
     this.typeBuffer = allocator.getEmpty();
     this.callBack = callBack;
     this.typeBufferAllocationSizeInBytes = BaseValueVector.INITIAL_VALUE_ALLOCATION * TYPE_WIDTH;
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/BaseFixedWidthVector.java b/java/vector/src/main/java/org/apache/arrow/vector/BaseFixedWidthVector.java
index 91937ca..e4bed23 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/BaseFixedWidthVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/BaseFixedWidthVector.java
@@ -25,7 +25,6 @@ import java.util.List;
 import org.apache.arrow.memory.BufferAllocator;
 import org.apache.arrow.vector.ipc.message.ArrowFieldNode;
 import org.apache.arrow.vector.types.pojo.Field;
-import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.CallBack;
 import org.apache.arrow.vector.util.OversizedAllocationException;
 import org.apache.arrow.vector.util.TransferPair;
@@ -52,16 +51,14 @@ public abstract class BaseFixedWidthVector extends BaseValueVector
   /**
    * Constructs a new instance.
    *
-   * @param name The name of the vector.
+   * @param field field materialized by this vector
    * @param allocator The allocator to use for allocating memory for the vector.
-   * @param fieldType The type of the buffer.
    * @param typeWidth The width in bytes of the type.
    */
-  public BaseFixedWidthVector(final String name, final BufferAllocator allocator,
-                                      FieldType fieldType, final int typeWidth) {
-    super(name, allocator);
+  public BaseFixedWidthVector(Field field, final BufferAllocator allocator, final int typeWidth) {
+    super(allocator);
     this.typeWidth = typeWidth;
-    field = new Field(name, fieldType, null);
+    this.field = field;
     valueCount = 0;
     allocationMonitor = 0;
     validityBuffer = allocator.getEmpty();
@@ -70,6 +67,11 @@ public abstract class BaseFixedWidthVector extends BaseValueVector
   }
 
 
+  @Override
+  public String getName() {
+    return field.getName();
+  }
+
   /* TODO:
    * see if getNullCount() can be made faster -- O(1)
    */
@@ -533,7 +535,7 @@ public abstract class BaseFixedWidthVector extends BaseValueVector
    */
   @Override
   public TransferPair getTransferPair(BufferAllocator allocator) {
-    return getTransferPair(name, allocator);
+    return getTransferPair(getName(), allocator);
   }
 
   /**
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/BaseValueVector.java b/java/vector/src/main/java/org/apache/arrow/vector/BaseValueVector.java
index bc12e8e..fc8e2e7 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/BaseValueVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/BaseValueVector.java
@@ -50,16 +50,16 @@ public abstract class BaseValueVector implements ValueVector {
   public static final int INITIAL_VALUE_ALLOCATION = 3970;
 
   protected final BufferAllocator allocator;
-  protected final String name;
 
-  protected BaseValueVector(String name, BufferAllocator allocator) {
+  protected BaseValueVector(BufferAllocator allocator) {
     this.allocator = Preconditions.checkNotNull(allocator, "allocator cannot be null");
-    this.name = name;
   }
 
+  public abstract String getName();
+
   @Override
   public String toString() {
-    return super.toString() + "[name = " + name + ", ...]";
+    return super.toString() + "[name = " + getName() + ", ...]";
   }
 
   @Override
@@ -73,7 +73,7 @@ public abstract class BaseValueVector implements ValueVector {
 
   @Override
   public TransferPair getTransferPair(BufferAllocator allocator) {
-    return getTransferPair(name, allocator);
+    return getTransferPair(getName(), allocator);
   }
 
   @Override
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java b/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java
index 5491302..e7fa289 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/BaseVariableWidthVector.java
@@ -27,7 +27,6 @@ import org.apache.arrow.memory.BufferAllocator;
 import org.apache.arrow.memory.OutOfMemoryException;
 import org.apache.arrow.vector.ipc.message.ArrowFieldNode;
 import org.apache.arrow.vector.types.pojo.Field;
-import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.CallBack;
 import org.apache.arrow.vector.util.OversizedAllocationException;
 import org.apache.arrow.vector.util.TransferPair;
@@ -58,17 +57,15 @@ public abstract class BaseVariableWidthVector extends BaseValueVector
   /**
    * Constructs a new instance.
    *
-   * @param name A name for the vector
+   * @param field The field materialized by this vector.
    * @param allocator The allocator to use for creating/resizing buffers
-   * @param fieldType The type of this vector.
    */
-  public BaseVariableWidthVector(final String name, final BufferAllocator allocator,
-                                         FieldType fieldType) {
-    super(name, allocator);
+  public BaseVariableWidthVector(Field field, final BufferAllocator allocator) {
+    super(allocator);
+    this.field = field;
     lastValueAllocationSizeInBytes = INITIAL_BYTE_COUNT;
     // -1 because we require one extra slot for the offset array.
     lastValueCapacity = INITIAL_VALUE_ALLOCATION - 1;
-    field = new Field(name, fieldType, null);
     valueCount = 0;
     lastSet = -1;
     offsetBuffer = allocator.getEmpty();
@@ -76,6 +73,11 @@ public abstract class BaseVariableWidthVector extends BaseValueVector
     valueBuffer = allocator.getEmpty();
   }
 
+  @Override
+  public String getName() {
+    return field.getName();
+  }
+
   /* TODO:
    * see if getNullCount() can be made faster -- O(1)
    */
@@ -656,7 +658,7 @@ public abstract class BaseVariableWidthVector extends BaseValueVector
    */
   @Override
   public TransferPair getTransferPair(BufferAllocator allocator) {
-    return getTransferPair(name, allocator);
+    return getTransferPair(getName(), allocator);
   }
 
   /**
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/BigIntVector.java b/java/vector/src/main/java/org/apache/arrow/vector/BigIntVector.java
index 416ffd5..6d235dd 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/BigIntVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/BigIntVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.BigIntHolder;
 import org.apache.arrow.vector.holders.NullableBigIntHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -59,7 +60,18 @@ public class BigIntVector extends BaseFixedWidthVector implements BaseIntVector
    * @param allocator allocator for memory management.
    */
   public BigIntVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a BigIntVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public BigIntVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new BigIntReaderImpl(BigIntVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/BitVector.java b/java/vector/src/main/java/org/apache/arrow/vector/BitVector.java
index ebaca4e..f75ccdc 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/BitVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/BitVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.BitHolder;
 import org.apache.arrow.vector.holders.NullableBitHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.OversizedAllocationException;
 import org.apache.arrow.vector.util.TransferPair;
@@ -59,7 +60,18 @@ public class BitVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public BitVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, 0);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a BitVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field the Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public BitVector(Field field, BufferAllocator allocator) {
+    super(field, allocator,0);
     reader = new BitReaderImpl(BitVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/DateDayVector.java b/java/vector/src/main/java/org/apache/arrow/vector/DateDayVector.java
index 1e2b012..e634e7e 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/DateDayVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/DateDayVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.DateDayHolder;
 import org.apache.arrow.vector.holders.NullableDateDayHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -59,7 +60,18 @@ public class DateDayVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public DateDayVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a DateDayVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public DateDayVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new DateDayReaderImpl(DateDayVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/DateMilliVector.java b/java/vector/src/main/java/org/apache/arrow/vector/DateMilliVector.java
index e8ea5be..7ea427d 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/DateMilliVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/DateMilliVector.java
@@ -27,6 +27,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.DateMilliHolder;
 import org.apache.arrow.vector.holders.NullableDateMilliHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.DateUtility;
 import org.apache.arrow.vector.util.TransferPair;
@@ -62,7 +63,18 @@ public class DateMilliVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public DateMilliVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a DateMilliVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public DateMilliVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new DateMilliReaderImpl(DateMilliVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java b/java/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java
index 9664bee..4fc35a3 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/DecimalVector.java
@@ -28,6 +28,7 @@ import org.apache.arrow.vector.holders.DecimalHolder;
 import org.apache.arrow.vector.holders.NullableDecimalHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.DecimalUtility;
 import org.apache.arrow.vector.util.TransferPair;
@@ -68,8 +69,19 @@ public class DecimalVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public DecimalVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
-    ArrowType.Decimal arrowType = (ArrowType.Decimal) fieldType.getType();
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a DecimalVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public DecimalVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
+    ArrowType.Decimal arrowType = (ArrowType.Decimal) field.getFieldType().getType();
     reader = new DecimalReaderImpl(DecimalVector.this);
     this.precision = arrowType.getPrecision();
     this.scale = arrowType.getScale();
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/DurationVector.java b/java/vector/src/main/java/org/apache/arrow/vector/DurationVector.java
index 312c8e5..76572bc 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/DurationVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/DurationVector.java
@@ -29,6 +29,7 @@ import org.apache.arrow.vector.holders.NullableDurationHolder;
 import org.apache.arrow.vector.types.TimeUnit;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -54,10 +55,20 @@ public class DurationVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public DurationVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
-    reader = new DurationReaderImpl(DurationVector.this);
-    this.unit =  ((ArrowType.Duration)fieldType.getType()).getUnit();
+    this(new Field(name, fieldType, null), allocator);
+  }
 
+  /**
+   * Instantiate a DurationVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public DurationVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
+    reader = new DurationReaderImpl(DurationVector.this);
+    this.unit =  ((ArrowType.Duration)field.getFieldType().getType()).getUnit();
   }
 
   /**
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/ExtensionTypeVector.java b/java/vector/src/main/java/org/apache/arrow/vector/ExtensionTypeVector.java
index 9594d9e..14a66f8 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/ExtensionTypeVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/ExtensionTypeVector.java
@@ -39,12 +39,35 @@ public abstract class ExtensionTypeVector<T extends BaseValueVector & FieldVecto
     FieldVector {
 
   private final T underlyingVector;
+  private final String name;
 
+  /**
+   * Instantiate an extension type vector.
+   * @param name name of the vector
+   * @param allocator allocator for memory management
+   * @param underlyingVector underlying filed vector
+   */
   public ExtensionTypeVector(String name, BufferAllocator allocator, T underlyingVector) {
-    super(name, allocator);
+    super(allocator);
+    this.name = name;
     this.underlyingVector = underlyingVector;
   }
 
+  /**
+   * Instantiate an extension type vector.
+   * @param field field materialized by this vector.
+   * @param allocator allocator for memory management
+   * @param underlyingVector underlying filed vector
+   */
+  public ExtensionTypeVector(Field field, BufferAllocator allocator, T underlyingVector) {
+    this(field.getName(), allocator, underlyingVector);
+  }
+
+  @Override
+  public String getName() {
+    return name;
+  }
+
   /** Get the underlying vector. */
   public T getUnderlyingVector() {
     return underlyingVector;
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/FixedSizeBinaryVector.java b/java/vector/src/main/java/org/apache/arrow/vector/FixedSizeBinaryVector.java
index a58f994..50179de 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/FixedSizeBinaryVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/FixedSizeBinaryVector.java
@@ -26,6 +26,7 @@ import org.apache.arrow.vector.holders.FixedSizeBinaryHolder;
 import org.apache.arrow.vector.holders.NullableFixedSizeBinaryHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType.FixedSizeBinary;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -61,9 +62,20 @@ public class FixedSizeBinaryVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public FixedSizeBinaryVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, ((FixedSizeBinary) fieldType.getType()).getByteWidth());
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a FixedSizeBinaryVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public FixedSizeBinaryVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, ((FixedSizeBinary) field.getFieldType().getType()).getByteWidth());
     reader = new FixedSizeBinaryReaderImpl(FixedSizeBinaryVector.this);
-    byteWidth = ((FixedSizeBinary) fieldType.getType()).getByteWidth();
+    byteWidth = ((FixedSizeBinary) field.getFieldType().getType()).getByteWidth();
   }
 
   /**
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/Float4Vector.java b/java/vector/src/main/java/org/apache/arrow/vector/Float4Vector.java
index c6d6d5b..7976b02 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/Float4Vector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/Float4Vector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.Float4Holder;
 import org.apache.arrow.vector.holders.NullableFloat4Holder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -59,7 +60,18 @@ public class Float4Vector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public Float4Vector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a Float4Vector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public Float4Vector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new Float4ReaderImpl(Float4Vector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/Float8Vector.java b/java/vector/src/main/java/org/apache/arrow/vector/Float8Vector.java
index bfcb3e0..109bf5d 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/Float8Vector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/Float8Vector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.Float8Holder;
 import org.apache.arrow.vector.holders.NullableFloat8Holder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -59,7 +60,18 @@ public class Float8Vector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public Float8Vector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a Float8Vector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public Float8Vector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new Float8ReaderImpl(Float8Vector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/IntVector.java b/java/vector/src/main/java/org/apache/arrow/vector/IntVector.java
index 5255d87..43e5f2c 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/IntVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/IntVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.IntHolder;
 import org.apache.arrow.vector.holders.NullableIntHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -59,7 +60,18 @@ public class IntVector extends BaseFixedWidthVector implements BaseIntVector {
    * @param allocator allocator for memory management.
    */
   public IntVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a IntVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public IntVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new IntReaderImpl(IntVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/IntervalDayVector.java b/java/vector/src/main/java/org/apache/arrow/vector/IntervalDayVector.java
index 3afe757..1bdbd48 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/IntervalDayVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/IntervalDayVector.java
@@ -27,6 +27,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.IntervalDayHolder;
 import org.apache.arrow.vector.holders.NullableIntervalDayHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -63,7 +64,18 @@ public class IntervalDayVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public IntervalDayVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a IntervalDayVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public IntervalDayVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new IntervalDayReaderImpl(IntervalDayVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/IntervalYearVector.java b/java/vector/src/main/java/org/apache/arrow/vector/IntervalYearVector.java
index 6d8c001..65e3b59 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/IntervalYearVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/IntervalYearVector.java
@@ -27,6 +27,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.IntervalYearHolder;
 import org.apache.arrow.vector.holders.NullableIntervalYearHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -61,7 +62,18 @@ public class IntervalYearVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public IntervalYearVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a IntervalYearVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public IntervalYearVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new IntervalYearReaderImpl(IntervalYearVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/SmallIntVector.java b/java/vector/src/main/java/org/apache/arrow/vector/SmallIntVector.java
index 2d3f78f..1a06bcd 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/SmallIntVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/SmallIntVector.java
@@ -26,6 +26,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableSmallIntHolder;
 import org.apache.arrow.vector.holders.SmallIntHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -60,7 +61,18 @@ public class SmallIntVector extends BaseFixedWidthVector implements BaseIntVecto
    * @param allocator allocator for memory management.
    */
   public SmallIntVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a SmallIntVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public SmallIntVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new SmallIntReaderImpl(SmallIntVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeMicroVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeMicroVector.java
index a8cb0fe..0f58bab 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeMicroVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeMicroVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeMicroHolder;
 import org.apache.arrow.vector.holders.TimeMicroHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -60,7 +61,18 @@ public class TimeMicroVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public TimeMicroVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a TimeMicroVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeMicroVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new TimeMicroReaderImpl(TimeMicroVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeMilliVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeMilliVector.java
index adf7562..5552353 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeMilliVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeMilliVector.java
@@ -27,6 +27,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeMilliHolder;
 import org.apache.arrow.vector.holders.TimeMilliHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.DateUtility;
 import org.apache.arrow.vector.util.TransferPair;
@@ -62,7 +63,18 @@ public class TimeMilliVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public TimeMilliVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a TimeMilliVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeMilliVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new TimeMilliReaderImpl(TimeMilliVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeNanoVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeNanoVector.java
index 2a28819..2c05952 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeNanoVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeNanoVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeNanoHolder;
 import org.apache.arrow.vector.holders.TimeNanoHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -59,7 +60,18 @@ public class TimeNanoVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public TimeNanoVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a TimeNanoVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeNanoVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new TimeNanoReaderImpl(TimeNanoVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeSecVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeSecVector.java
index 5198a26..02e9dcb 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeSecVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeSecVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeSecHolder;
 import org.apache.arrow.vector.holders.TimeSecHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -59,7 +60,18 @@ public class TimeSecVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public TimeSecVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a TimeSecVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeSecVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new TimeSecReaderImpl(TimeSecVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroTZVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroTZVector.java
index 7027f4f..5b4bc2a 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroTZVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroTZVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.holders.TimeStampMicroTZHolder;
 import org.apache.arrow.vector.types.TimeUnit;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -64,6 +65,20 @@ public class TimeStampMicroTZVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampMicroTZVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampMicroTZVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    ArrowType.Timestamp arrowType = (ArrowType.Timestamp) field.getFieldType().getType();
+    timeZone = arrowType.getTimezone();
+    reader = new TimeStampMicroTZReaderImpl(TimeStampMicroTZVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroVector.java
index 2a427de..7a5f8d8 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMicroVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeStampMicroHolder;
 import org.apache.arrow.vector.holders.TimeStampMicroHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.DateUtility;
 import org.apache.arrow.vector.util.TransferPair;
@@ -62,6 +63,18 @@ public class TimeStampMicroVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampMicroVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampMicroVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    reader = new TimeStampMicroReaderImpl(TimeStampMicroVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliTZVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliTZVector.java
index 7cb83be..358aa96 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliTZVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliTZVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.holders.TimeStampMilliTZHolder;
 import org.apache.arrow.vector.types.TimeUnit;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -64,6 +65,20 @@ public class TimeStampMilliTZVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampMilliTZVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampMilliTZVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    ArrowType.Timestamp arrowType = (ArrowType.Timestamp) field.getFieldType().getType();
+    timeZone = arrowType.getTimezone();
+    reader = new TimeStampMilliTZReaderImpl(TimeStampMilliTZVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliVector.java
index b05749e..d05250c 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampMilliVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeStampMilliHolder;
 import org.apache.arrow.vector.holders.TimeStampMilliHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.DateUtility;
 import org.apache.arrow.vector.util.TransferPair;
@@ -62,6 +63,18 @@ public class TimeStampMilliVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampMilliVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampMilliVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    reader = new TimeStampMilliReaderImpl(TimeStampMilliVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoTZVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoTZVector.java
index eacc891..a668a6c 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoTZVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoTZVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.holders.TimeStampNanoTZHolder;
 import org.apache.arrow.vector.types.TimeUnit;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -64,6 +65,20 @@ public class TimeStampNanoTZVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampNanoTZVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampNanoTZVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    ArrowType.Timestamp arrowType = (ArrowType.Timestamp) field.getFieldType().getType();
+    timeZone = arrowType.getTimezone();
+    reader = new TimeStampNanoTZReaderImpl(TimeStampNanoTZVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoVector.java
index ccc17de..70f4db6 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampNanoVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeStampNanoHolder;
 import org.apache.arrow.vector.holders.TimeStampNanoHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.DateUtility;
 import org.apache.arrow.vector.util.TransferPair;
@@ -62,6 +63,18 @@ public class TimeStampNanoVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampNanoVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampNanoVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    reader = new TimeStampNanoReaderImpl(TimeStampNanoVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecTZVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecTZVector.java
index 3f24c18..fe6fe79 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecTZVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecTZVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.holders.TimeStampSecTZHolder;
 import org.apache.arrow.vector.types.TimeUnit;
 import org.apache.arrow.vector.types.Types.MinorType;
 import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -64,6 +65,20 @@ public class TimeStampSecTZVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampSecTZVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampSecTZVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    ArrowType.Timestamp arrowType = (ArrowType.Timestamp) field.getFieldType().getType();
+    timeZone = arrowType.getTimezone();
+    reader = new TimeStampSecTZReaderImpl(TimeStampSecTZVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecVector.java
index 2293c10..686c4a4 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampSecVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTimeStampSecHolder;
 import org.apache.arrow.vector.holders.TimeStampSecHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.DateUtility;
 import org.apache.arrow.vector.util.TransferPair;
@@ -62,6 +63,18 @@ public class TimeStampSecVector extends TimeStampVector {
   }
 
   /**
+   * Instantiate a TimeStampSecVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field Field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampSecVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
+    reader = new TimeStampSecReaderImpl(TimeStampSecVector.this);
+  }
+
+  /**
    * Get a reader that supports reading values from this vector.
    *
    * @return Field Reader for this vector
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampVector.java
index d4aa9d8..dea0510 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TimeStampVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TimeStampVector.java
@@ -20,6 +20,7 @@ package org.apache.arrow.vector;
 import static org.apache.arrow.vector.NullCheckingForGet.NULL_CHECKING_ENABLED;
 
 import org.apache.arrow.memory.BufferAllocator;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -42,7 +43,18 @@ public abstract class TimeStampVector extends BaseFixedWidthVector {
    * @param allocator allocator for memory management.
    */
   public TimeStampVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a TimeStampVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TimeStampVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
   }
 
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/TinyIntVector.java b/java/vector/src/main/java/org/apache/arrow/vector/TinyIntVector.java
index 66f7ca3..673740d 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/TinyIntVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/TinyIntVector.java
@@ -26,6 +26,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableTinyIntHolder;
 import org.apache.arrow.vector.holders.TinyIntHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -60,7 +61,18 @@ public class TinyIntVector extends BaseFixedWidthVector implements BaseIntVector
    * @param allocator allocator for memory management.
    */
   public TinyIntVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a TinyIntVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public TinyIntVector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new TinyIntReaderImpl(TinyIntVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/UInt1Vector.java b/java/vector/src/main/java/org/apache/arrow/vector/UInt1Vector.java
index 85d48ad..a57e1ef 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/UInt1Vector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/UInt1Vector.java
@@ -26,6 +26,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableUInt1Holder;
 import org.apache.arrow.vector.holders.UInt1Holder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -45,7 +46,11 @@ public class UInt1Vector extends BaseFixedWidthVector implements BaseIntVector {
   }
 
   public UInt1Vector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  public UInt1Vector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new UInt1ReaderImpl(UInt1Vector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/UInt2Vector.java b/java/vector/src/main/java/org/apache/arrow/vector/UInt2Vector.java
index dbea9f8..c29adf6 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/UInt2Vector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/UInt2Vector.java
@@ -26,6 +26,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableUInt2Holder;
 import org.apache.arrow.vector.holders.UInt2Holder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -45,7 +46,11 @@ public class UInt2Vector extends BaseFixedWidthVector implements BaseIntVector {
   }
 
   public UInt2Vector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  public UInt2Vector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new UInt2ReaderImpl(UInt2Vector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/UInt4Vector.java b/java/vector/src/main/java/org/apache/arrow/vector/UInt4Vector.java
index b2eadc2..65d0e32 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/UInt4Vector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/UInt4Vector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableUInt4Holder;
 import org.apache.arrow.vector.holders.UInt4Holder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -44,7 +45,11 @@ public class UInt4Vector extends BaseFixedWidthVector implements BaseIntVector {
   }
 
   public UInt4Vector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  public UInt4Vector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new UInt4ReaderImpl(UInt4Vector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/UInt8Vector.java b/java/vector/src/main/java/org/apache/arrow/vector/UInt8Vector.java
index a1b3bda..e756132 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/UInt8Vector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/UInt8Vector.java
@@ -27,6 +27,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableUInt8Holder;
 import org.apache.arrow.vector.holders.UInt8Holder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -46,7 +47,11 @@ public class UInt8Vector extends BaseFixedWidthVector implements BaseIntVector {
   }
 
   public UInt8Vector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType, TYPE_WIDTH);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  public UInt8Vector(Field field, BufferAllocator allocator) {
+    super(field, allocator, TYPE_WIDTH);
     reader = new UInt8ReaderImpl(UInt8Vector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/VarBinaryVector.java b/java/vector/src/main/java/org/apache/arrow/vector/VarBinaryVector.java
index 093ffac..ac6df0d 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/VarBinaryVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/VarBinaryVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableVarBinaryHolder;
 import org.apache.arrow.vector.holders.VarBinaryHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.TransferPair;
 
@@ -56,7 +57,18 @@ public class VarBinaryVector extends BaseVariableWidthVector {
    * @param allocator allocator for memory management.
    */
   public VarBinaryVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a VarBinaryVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public VarBinaryVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
     reader = new VarBinaryReaderImpl(VarBinaryVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/VarCharVector.java b/java/vector/src/main/java/org/apache/arrow/vector/VarCharVector.java
index 5b2623c..3e035fa 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/VarCharVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/VarCharVector.java
@@ -25,6 +25,7 @@ import org.apache.arrow.vector.complex.reader.FieldReader;
 import org.apache.arrow.vector.holders.NullableVarCharHolder;
 import org.apache.arrow.vector.holders.VarCharHolder;
 import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.Text;
 import org.apache.arrow.vector.util.TransferPair;
@@ -55,7 +56,18 @@ public class VarCharVector extends BaseVariableWidthVector {
    * @param allocator allocator for memory management.
    */
   public VarCharVector(String name, FieldType fieldType, BufferAllocator allocator) {
-    super(name, allocator, fieldType);
+    this(new Field(name, fieldType, null), allocator);
+  }
+
+  /**
+   * Instantiate a VarCharVector. This doesn't allocate any memory for
+   * the data in vector.
+   *
+   * @param field field materialized by this vector
+   * @param allocator allocator for memory management.
+   */
+  public VarCharVector(Field field, BufferAllocator allocator) {
+    super(field, allocator);
     reader = new VarCharReaderImpl(VarCharVector.this);
   }
 
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java
index a370cb8..3ea418e 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/BaseRepeatedValueVector.java
@@ -55,13 +55,15 @@ public abstract class BaseRepeatedValueVector extends BaseValueVector implements
   protected final CallBack callBack;
   protected int valueCount;
   protected int offsetAllocationSizeInBytes = INITIAL_VALUE_ALLOCATION * OFFSET_WIDTH;
+  private final String name;
 
   protected BaseRepeatedValueVector(String name, BufferAllocator allocator, CallBack callBack) {
     this(name, allocator, DEFAULT_DATA_VECTOR, callBack);
   }
 
   protected BaseRepeatedValueVector(String name, BufferAllocator allocator, FieldVector vector, CallBack callBack) {
-    super(name, allocator);
+    super(allocator);
+    this.name = name;
     this.offsetBuffer = allocator.getEmpty();
     this.vector = Preconditions.checkNotNull(vector, "data vector cannot be null");
     this.callBack = callBack;
@@ -69,6 +71,11 @@ public abstract class BaseRepeatedValueVector extends BaseValueVector implements
   }
 
   @Override
+  public String getName() {
+    return name;
+  }
+
+  @Override
   public boolean allocateNewSafe() {
     boolean dataAlloc = false;
     try {
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java
index 35bede6..f62ec59 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/FixedSizeListVector.java
@@ -65,6 +65,7 @@ public class FixedSizeListVector extends BaseValueVector implements FieldVector,
   private ArrowBuf validityBuffer;
   private final int listSize;
   private final FieldType fieldType;
+  private final String name;
 
   private UnionFixedSizeListReader reader;
   private int valueCount;
@@ -94,8 +95,9 @@ public class FixedSizeListVector extends BaseValueVector implements FieldVector,
                              BufferAllocator allocator,
                              FieldType fieldType,
                              CallBack unusedSchemaChangeCallback) {
-    super(name, allocator);
+    super(allocator);
 
+    this.name = name;
     this.validityBuffer = allocator.getEmpty();
     this.vector = ZeroVector.INSTANCE;
     this.fieldType = fieldType;
@@ -117,6 +119,11 @@ public class FixedSizeListVector extends BaseValueVector implements FieldVector,
     return MinorType.FIXED_SIZE_LIST;
   }
 
+  @Override
+  public String getName() {
+    return name;
+  }
+
   /** Get the fixed size for each list. */
   public int getListSize() {
     return listSize;
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/complex/ListVector.java b/java/vector/src/main/java/org/apache/arrow/vector/complex/ListVector.java
index bfbc5c7..e8b402c 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/complex/ListVector.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/complex/ListVector.java
@@ -568,7 +568,7 @@ public class ListVector extends BaseRepeatedValueVector implements FieldVector,
 
   @Override
   public Field getField() {
-    return new Field(name, fieldType, Collections.singletonList(getDataVector().getField()));
+    return new Field(getName(), fieldType, Collections.singletonList(getDataVector().getField()));
   }
 
   @Override
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java b/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java
index 9eb7d95..35aafcb 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/types/Types.java
@@ -120,6 +120,7 @@ import org.apache.arrow.vector.types.pojo.ArrowType.Time;
 import org.apache.arrow.vector.types.pojo.ArrowType.Timestamp;
 import org.apache.arrow.vector.types.pojo.ArrowType.Union;
 import org.apache.arrow.vector.types.pojo.ArrowType.Utf8;
+import org.apache.arrow.vector.types.pojo.Field;
 import org.apache.arrow.vector.types.pojo.FieldType;
 import org.apache.arrow.vector.util.CallBack;
 
@@ -133,8 +134,7 @@ public class Types {
     NULL(Null.INSTANCE) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
         return ZeroVector.INSTANCE;
@@ -148,11 +148,10 @@ public class Types {
     STRUCT(Struct.INSTANCE) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new StructVector(name, allocator, fieldType, schemaChangeCallback);
+        return new StructVector(field.getName(), allocator, field.getFieldType(), schemaChangeCallback);
       }
 
       @Override
@@ -163,11 +162,10 @@ public class Types {
     TINYINT(new Int(8, true)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TinyIntVector(name, fieldType, allocator);
+        return new TinyIntVector(field, allocator);
       }
 
       @Override
@@ -178,11 +176,10 @@ public class Types {
     SMALLINT(new Int(16, true)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new SmallIntVector(name, fieldType, allocator);
+        return new SmallIntVector(field, allocator);
       }
 
       @Override
@@ -193,11 +190,10 @@ public class Types {
     INT(new Int(32, true)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new IntVector(name, fieldType, allocator);
+        return new IntVector(field, allocator);
       }
 
       @Override
@@ -208,11 +204,10 @@ public class Types {
     BIGINT(new Int(64, true)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new BigIntVector(name, fieldType, allocator);
+        return new BigIntVector(field, allocator);
       }
 
       @Override
@@ -223,11 +218,10 @@ public class Types {
     DATEDAY(new Date(DateUnit.DAY)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new DateDayVector(name, fieldType, allocator);
+        return new DateDayVector(field, allocator);
       }
 
       @Override
@@ -238,11 +232,10 @@ public class Types {
     DATEMILLI(new Date(DateUnit.MILLISECOND)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new DateMilliVector(name, fieldType, allocator);
+        return new DateMilliVector(field, allocator);
       }
 
       @Override
@@ -253,11 +246,10 @@ public class Types {
     TIMESEC(new Time(TimeUnit.SECOND, 32)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeSecVector(name, fieldType, allocator);
+        return new TimeSecVector(field, allocator);
       }
 
       @Override
@@ -268,11 +260,10 @@ public class Types {
     TIMEMILLI(new Time(TimeUnit.MILLISECOND, 32)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeMilliVector(name, fieldType, allocator);
+        return new TimeMilliVector(field, allocator);
       }
 
       @Override
@@ -283,11 +274,10 @@ public class Types {
     TIMEMICRO(new Time(TimeUnit.MICROSECOND, 64)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeMicroVector(name, fieldType, allocator);
+        return new TimeMicroVector(field, allocator);
       }
 
       @Override
@@ -298,11 +288,10 @@ public class Types {
     TIMENANO(new Time(TimeUnit.NANOSECOND, 64)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeNanoVector(name, fieldType, allocator);
+        return new TimeNanoVector(field, allocator);
       }
 
       @Override
@@ -314,11 +303,10 @@ public class Types {
     TIMESTAMPSEC(new Timestamp(org.apache.arrow.vector.types.TimeUnit.SECOND, null)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampSecVector(name, fieldType, allocator);
+        return new TimeStampSecVector(field, allocator);
       }
 
       @Override
@@ -330,11 +318,10 @@ public class Types {
     TIMESTAMPMILLI(new Timestamp(org.apache.arrow.vector.types.TimeUnit.MILLISECOND, null)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampMilliVector(name, fieldType, allocator);
+        return new TimeStampMilliVector(field, allocator);
       }
 
       @Override
@@ -346,11 +333,10 @@ public class Types {
     TIMESTAMPMICRO(new Timestamp(org.apache.arrow.vector.types.TimeUnit.MICROSECOND, null)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampMicroVector(name, fieldType, allocator);
+        return new TimeStampMicroVector(field, allocator);
       }
 
       @Override
@@ -362,11 +348,10 @@ public class Types {
     TIMESTAMPNANO(new Timestamp(org.apache.arrow.vector.types.TimeUnit.NANOSECOND, null)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampNanoVector(name, fieldType, allocator);
+        return new TimeStampNanoVector(field, allocator);
       }
 
       @Override
@@ -377,11 +362,10 @@ public class Types {
     INTERVALDAY(new Interval(IntervalUnit.DAY_TIME)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new IntervalDayVector(name, fieldType, allocator);
+        return new IntervalDayVector(field, allocator);
       }
 
       @Override
@@ -392,11 +376,10 @@ public class Types {
     DURATION(null) {
       @Override
       public FieldVector getNewVector(
-              String name,
-              FieldType fieldType,
-              BufferAllocator allocator,
-              CallBack schemaChangeCallback) {
-        return new DurationVector(name, fieldType, allocator);
+          Field field,
+          BufferAllocator allocator,
+          CallBack schemaChangeCallback) {
+        return new DurationVector(field, allocator);
       }
 
       @Override
@@ -409,11 +392,10 @@ public class Types {
     INTERVALYEAR(new Interval(IntervalUnit.YEAR_MONTH)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new IntervalYearVector(name, fieldType, allocator);
+        return new IntervalYearVector(field, allocator);
       }
 
       @Override
@@ -425,11 +407,10 @@ public class Types {
     FLOAT4(new FloatingPoint(SINGLE)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new Float4Vector(name, fieldType, allocator);
+        return new Float4Vector(field, allocator);
       }
 
       @Override
@@ -441,11 +422,10 @@ public class Types {
     FLOAT8(new FloatingPoint(DOUBLE)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new Float8Vector(name, fieldType, allocator);
+        return new Float8Vector(field, allocator);
       }
 
       @Override
@@ -456,11 +436,10 @@ public class Types {
     BIT(Bool.INSTANCE) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new BitVector(name, fieldType, allocator);
+        return new BitVector(field, allocator);
       }
 
       @Override
@@ -471,11 +450,10 @@ public class Types {
     VARCHAR(Utf8.INSTANCE) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new VarCharVector(name, fieldType, allocator);
+        return new VarCharVector(field, allocator);
       }
 
       @Override
@@ -486,11 +464,10 @@ public class Types {
     VARBINARY(Binary.INSTANCE) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new VarBinaryVector(name, fieldType, allocator);
+        return new VarBinaryVector(field, allocator);
       }
 
       @Override
@@ -501,11 +478,10 @@ public class Types {
     DECIMAL(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new DecimalVector(name, fieldType, allocator);
+        return new DecimalVector(field, allocator);
       }
 
       @Override
@@ -516,11 +492,10 @@ public class Types {
     FIXEDSIZEBINARY(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new FixedSizeBinaryVector(name, fieldType, allocator);
+        return new FixedSizeBinaryVector(field, allocator);
       }
 
       @Override
@@ -531,11 +506,10 @@ public class Types {
     UINT1(new Int(8, false)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new UInt1Vector(name, fieldType, allocator);
+        return new UInt1Vector(field, allocator);
       }
 
       @Override
@@ -546,11 +520,10 @@ public class Types {
     UINT2(new Int(16, false)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new UInt2Vector(name, fieldType, allocator);
+        return new UInt2Vector(field, allocator);
       }
 
       @Override
@@ -561,11 +534,10 @@ public class Types {
     UINT4(new Int(32, false)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new UInt4Vector(name, fieldType, allocator);
+        return new UInt4Vector(field, allocator);
       }
 
       @Override
@@ -576,11 +548,10 @@ public class Types {
     UINT8(new Int(64, false)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new UInt8Vector(name, fieldType, allocator);
+        return new UInt8Vector(field, allocator);
       }
 
       @Override
@@ -591,11 +562,10 @@ public class Types {
     LIST(List.INSTANCE) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new ListVector(name, allocator, fieldType, schemaChangeCallback);
+        return new ListVector(field.getName(), allocator, field.getFieldType(), schemaChangeCallback);
       }
 
       @Override
@@ -606,11 +576,10 @@ public class Types {
     FIXED_SIZE_LIST(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new FixedSizeListVector(name, allocator, fieldType, schemaChangeCallback);
+        return new FixedSizeListVector(field.getName(), allocator, field.getFieldType(), schemaChangeCallback);
       }
 
       @Override
@@ -622,15 +591,14 @@ public class Types {
     UNION(new Union(Sparse, null)) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        if (fieldType.getDictionary() != null) {
+        if (field.getFieldType().getDictionary() != null) {
           throw new UnsupportedOperationException("Dictionary encoding not supported for complex " +
-            "types");
+              "types");
         }
-        return new UnionVector(name, allocator, schemaChangeCallback);
+        return new UnionVector(field.getName(), allocator, schemaChangeCallback);
       }
 
       @Override
@@ -641,11 +609,10 @@ public class Types {
     MAP(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new MapVector(name, allocator, fieldType, schemaChangeCallback);
+        return new MapVector(field.getName(), allocator, field.getFieldType(), schemaChangeCallback);
       }
 
       @Override
@@ -656,11 +623,10 @@ public class Types {
     TIMESTAMPSECTZ(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampSecTZVector(name, fieldType, allocator);
+        return new TimeStampSecTZVector(field, allocator);
       }
 
       @Override
@@ -671,11 +637,10 @@ public class Types {
     TIMESTAMPMILLITZ(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampMilliTZVector(name, fieldType, allocator);
+        return new TimeStampMilliTZVector(field, allocator);
       }
 
       @Override
@@ -686,11 +651,10 @@ public class Types {
     TIMESTAMPMICROTZ(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampMicroTZVector(name, fieldType, allocator);
+        return new TimeStampMicroTZVector(field, allocator);
       }
 
       @Override
@@ -701,11 +665,10 @@ public class Types {
     TIMESTAMPNANOTZ(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return new TimeStampNanoTZVector(name, fieldType, allocator);
+        return new TimeStampNanoTZVector(field, allocator);
       }
 
       @Override
@@ -716,11 +679,11 @@ public class Types {
     EXTENSIONTYPE(null) {
       @Override
       public FieldVector getNewVector(
-          String name,
-          FieldType fieldType,
+          Field field,
           BufferAllocator allocator,
           CallBack schemaChangeCallback) {
-        return ((ExtensionType) fieldType.getType()).getNewVector(name, fieldType, allocator);
+        return ((ExtensionType) field.getFieldType().getType()).getNewVector(field.getName(),
+            field.getFieldType(), allocator);
       }
 
       @Override
@@ -747,10 +710,18 @@ public class Types {
     }
 
     /** Constructs a new vector for the given type. */
-    public abstract FieldVector getNewVector(
+    public final FieldVector getNewVector(
         String name,
         FieldType fieldType,
         BufferAllocator allocator,
+        CallBack schemaChangeCallback) {
+      return getNewVector(new Field(name, fieldType, null), allocator, schemaChangeCallback);
+    }
+
+    /** Constructs a new vector for the given type. */
+    public abstract FieldVector getNewVector(
+        Field field,
+        BufferAllocator allocator,
         CallBack schemaChangeCallback);
 
     public abstract FieldWriter getNewFieldWriter(ValueVector vector);
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java
index 99ceb6a..c35e844 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/Field.java
@@ -108,7 +108,7 @@ public class Field {
    * Construct a new vector of this type using the given allocator.
    */
   public FieldVector createVector(BufferAllocator allocator) {
-    FieldVector vector = fieldType.createNewSingleVector(name, allocator, null);
+    FieldVector vector = fieldType.createNewSingleVector(this, allocator, null);
     vector.initializeChildrenFromFields(children);
     return vector;
   }
diff --git a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/FieldType.java b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/FieldType.java
index 4cc4067..945f5df 100644
--- a/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/FieldType.java
+++ b/java/vector/src/main/java/org/apache/arrow/vector/types/pojo/FieldType.java
@@ -98,4 +98,9 @@ public class FieldType {
     return minorType.getNewVector(name, this, allocator, schemaCallBack);
   }
 
+  public FieldVector createNewSingleVector(Field field, BufferAllocator allocator, CallBack schemaCallBack) {
+    MinorType minorType = Types.getMinorTypeForArrowType(type);
+    return minorType.getNewVector(field, allocator, schemaCallBack);
+  }
+
 }
diff --git a/java/vector/src/test/java/org/apache/arrow/vector/TestVectorAlloc.java b/java/vector/src/test/java/org/apache/arrow/vector/TestVectorAlloc.java
new file mode 100644
index 0000000..089f1f8
--- /dev/null
+++ b/java/vector/src/test/java/org/apache/arrow/vector/TestVectorAlloc.java
@@ -0,0 +1,106 @@
+/*
+ * 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.
+ */
+
+package org.apache.arrow.vector;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.apache.arrow.memory.BufferAllocator;
+import org.apache.arrow.memory.RootAllocator;
+import org.apache.arrow.vector.types.TimeUnit;
+import org.apache.arrow.vector.types.Types;
+import org.apache.arrow.vector.types.Types.MinorType;
+import org.apache.arrow.vector.types.pojo.ArrowType;
+import org.apache.arrow.vector.types.pojo.ArrowType.Decimal;
+import org.apache.arrow.vector.types.pojo.ArrowType.Duration;
+import org.apache.arrow.vector.types.pojo.ArrowType.FixedSizeBinary;
+import org.apache.arrow.vector.types.pojo.ArrowType.Timestamp;
+import org.apache.arrow.vector.types.pojo.Field;
+import org.apache.arrow.vector.types.pojo.FieldType;
+import org.apache.arrow.vector.types.pojo.Schema;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestVectorAlloc {
+  private BufferAllocator rootAllocator;
+
+  @Before
+  public void init() {
+    rootAllocator = new RootAllocator(Long.MAX_VALUE);
+  }
+
+  @After
+  public void terminate() throws Exception {
+    rootAllocator.close();
+  }
+
+  private static Field field(String name, ArrowType type) {
+    return new Field(name, new FieldType(true, type, null), Collections.emptyList());
+  }
+
+  @Test
+  public void testVectorAllocWithField() {
+    Schema schema = new Schema(Arrays.asList(
+        field("TINYINT", MinorType.TINYINT.getType()),
+        field("SMALLINT", MinorType.SMALLINT.getType()),
+        field("INT", MinorType.INT.getType()),
+        field("BIGINT", MinorType.BIGINT.getType()),
+        field("UINT1", MinorType.UINT1.getType()),
+        field("UINT2", MinorType.UINT2.getType()),
+        field("UINT4", MinorType.UINT4.getType()),
+        field("UINT8", MinorType.UINT8.getType()),
+        field("FLOAT4", MinorType.FLOAT4.getType()),
+        field("FLOAT8", MinorType.FLOAT8.getType()),
+        field("UTF8", MinorType.VARCHAR.getType()),
+        field("VARBINARY", MinorType.VARBINARY.getType()),
+        field("BIT", MinorType.BIT.getType()),
+        field("DECIMAL", new Decimal(38, 5)),
+        field("FIXEDSIZEBINARY", new FixedSizeBinary(50)),
+        field("DATEDAY", MinorType.DATEDAY.getType()),
+        field("DATEMILLI", MinorType.DATEMILLI.getType()),
+        field("TIMESEC", MinorType.TIMESEC.getType()),
+        field("TIMEMILLI", MinorType.TIMEMILLI.getType()),
+        field("TIMEMICRO", MinorType.TIMEMICRO.getType()),
+        field("TIMENANO", MinorType.TIMENANO.getType()),
+        field("TIMESTAMPSEC", MinorType.TIMESTAMPSEC.getType()),
+        field("TIMESTAMPMILLI", MinorType.TIMESTAMPMILLI.getType()),
+        field("TIMESTAMPMICRO", MinorType.TIMESTAMPMICRO.getType()),
+        field("TIMESTAMPNANO", MinorType.TIMESTAMPNANO.getType()),
+        field("TIMESTAMPSECTZ", new Timestamp(TimeUnit.SECOND, "PST")),
+        field("TIMESTAMPMILLITZ", new Timestamp(TimeUnit.MILLISECOND, "PST")),
+        field("TIMESTAMPMICROTZ", new Timestamp(TimeUnit.MICROSECOND, "PST")),
+        field("TIMESTAMPNANOTZ", new Timestamp(TimeUnit.NANOSECOND, "PST")),
+        field("INTERVALDAY", MinorType.INTERVALDAY.getType()),
+        field("INTERVALYEAR", MinorType.INTERVALYEAR.getType()),
+        field("DURATION", new Duration(TimeUnit.MILLISECOND))
+    ));
+
+    try (BufferAllocator allocator = rootAllocator.newChildAllocator("child", 0, Long.MAX_VALUE)) {
+      for (Field field : schema.getFields()) {
+        try (FieldVector vector = field.createVector(allocator)) {
+          assertEquals(vector.getMinorType(),
+              Types.getMinorTypeForArrowType(field.getFieldType().getType()));
+          vector.allocateNew();
+        }
+      }
+    }
+  }
+}