in hologres-connector-spark-base/src/main/scala/com/alibaba/hologres/spark/source/copy/arrow/SparkArrowVectorAccessorUtil.scala [30:73]
def createColumnVectorAccessor(vector: FieldVector, column: Column): AbstractArrowVectorAccessor = column.getType match {
case Types.INTEGER =>
new BaseArrowIntAccessor(vector.asInstanceOf[IntVector])
case Types.BIGINT =>
new BaseArrowBigIntAccessor(vector.asInstanceOf[BigIntVector])
case Types.SMALLINT =>
new BaseArrowSmallIntAccessor(vector.asInstanceOf[SmallIntVector])
case Types.FLOAT | Types.REAL =>
new BaseArrowFloat4Accessor(vector.asInstanceOf[Float4Vector])
case Types.DOUBLE =>
new BaseArrowFloat8Accessor(vector.asInstanceOf[Float8Vector])
case Types.DECIMAL | Types.NUMERIC =>
new SparkArrowDecimalAccessor(vector.asInstanceOf[DecimalVector], column.getScale)
case Types.BOOLEAN | Types.BIT =>
new BaseArrowUInt1Accessor(vector.asInstanceOf[UInt1Vector])
case Types.CHAR =>
new SparkArrowStringAccessor(vector.asInstanceOf[VarCharVector], column.getPrecision)
case Types.VARCHAR =>
new SparkArrowStringAccessor(vector.asInstanceOf[VarCharVector])
case Types.BINARY | Types.VARBINARY =>
new BaseArrowVarBinaryAccessor(vector.asInstanceOf[VarBinaryVector])
case Types.TIMESTAMP | Types.TIME_WITH_TIMEZONE =>
if (column.getTypeName == "timestamptz") new SparkArrowDateMilliAccessor(vector.asInstanceOf[DateMilliVector])
else new SparkArrowTimeStampMicroAccessor(vector.asInstanceOf[TimeStampMicroVector])
case Types.TIME =>
if (column.getTypeName == "timetz") new BaseArrowFixedSizeBinaryAccessor(vector.asInstanceOf[FixedSizeBinaryVector])
else new BaseArrowTimeMicroAccessor(vector.asInstanceOf[TimeMicroVector])
case Types.DATE =>
new SparkArrowDateDayAccessor(vector.asInstanceOf[DateDayVector])
case Types.ARRAY =>
val elementAccessor: AbstractArrowVectorAccessor =
createArrayElementVectorAccessor(vector.asInstanceOf[ListVector].getDataVector, column.getArrayElementType);
new SparkArrowArrayAccessor(vector.asInstanceOf[ListVector], column.getArrayElementType, elementAccessor)
case Types.OTHER =>
if (column.getTypeName == "jsonb") {
throw new IllegalArgumentException(s"copy out with arrow format unsupported column type ${column.getTypeName} now.")
} else if (column.getTypeName == "roaringbitmap") {
new BaseArrowVarBinaryAccessor(vector.asInstanceOf[VarBinaryVector])
} else {
new SparkArrowStringAccessor(vector.asInstanceOf[VarCharVector])
}
case _ =>
throw new IllegalArgumentException("Unsupported column type: " + column.getTypeName)
}