in hudi-flink-datasource/hudi-flink1.18.x/src/main/java/org/apache/hudi/table/format/cow/ParquetSplitReaderUtil.java [185:326]
private static ColumnVector createVectorFromConstant(
LogicalType type,
Object value,
int batchSize) {
switch (type.getTypeRoot()) {
case CHAR:
case VARCHAR:
case BINARY:
case VARBINARY:
HeapBytesVector bsv = new HeapBytesVector(batchSize);
if (value == null) {
bsv.fillWithNulls();
} else {
bsv.fill(value instanceof byte[]
? (byte[]) value
: getUTF8Bytes(value.toString()));
}
return bsv;
case BOOLEAN:
HeapBooleanVector bv = new HeapBooleanVector(batchSize);
if (value == null) {
bv.fillWithNulls();
} else {
bv.fill((boolean) value);
}
return bv;
case TINYINT:
HeapByteVector byteVector = new HeapByteVector(batchSize);
if (value == null) {
byteVector.fillWithNulls();
} else {
byteVector.fill(((Number) value).byteValue());
}
return byteVector;
case SMALLINT:
HeapShortVector sv = new HeapShortVector(batchSize);
if (value == null) {
sv.fillWithNulls();
} else {
sv.fill(((Number) value).shortValue());
}
return sv;
case INTEGER:
HeapIntVector iv = new HeapIntVector(batchSize);
if (value == null) {
iv.fillWithNulls();
} else {
iv.fill(((Number) value).intValue());
}
return iv;
case BIGINT:
HeapLongVector lv = new HeapLongVector(batchSize);
if (value == null) {
lv.fillWithNulls();
} else {
lv.fill(((Number) value).longValue());
}
return lv;
case DECIMAL:
HeapDecimalVector decv = new HeapDecimalVector(batchSize);
if (value == null) {
decv.fillWithNulls();
} else {
DecimalType decimalType = (DecimalType) type;
int precision = decimalType.getPrecision();
int scale = decimalType.getScale();
DecimalData decimal = Preconditions.checkNotNull(
DecimalData.fromBigDecimal((BigDecimal) value, precision, scale));
decv.fill(decimal.toUnscaledBytes());
}
return decv;
case FLOAT:
HeapFloatVector fv = new HeapFloatVector(batchSize);
if (value == null) {
fv.fillWithNulls();
} else {
fv.fill(((Number) value).floatValue());
}
return fv;
case DOUBLE:
HeapDoubleVector dv = new HeapDoubleVector(batchSize);
if (value == null) {
dv.fillWithNulls();
} else {
dv.fill(((Number) value).doubleValue());
}
return dv;
case DATE:
if (value instanceof LocalDate) {
value = Date.valueOf((LocalDate) value);
}
return createVectorFromConstant(
new IntType(),
value == null ? null : toInternal((Date) value),
batchSize);
case TIMESTAMP_WITHOUT_TIME_ZONE:
HeapTimestampVector tv = new HeapTimestampVector(batchSize);
if (value == null) {
tv.fillWithNulls();
} else {
tv.fill(TimestampData.fromLocalDateTime((LocalDateTime) value));
}
return tv;
case ARRAY:
ArrayType arrayType = (ArrayType) type;
if (arrayType.getElementType().isAnyOf(LogicalTypeFamily.CONSTRUCTED)) {
HeapArrayGroupColumnVector arrayGroup = new HeapArrayGroupColumnVector(batchSize);
if (value == null) {
arrayGroup.fillWithNulls();
return arrayGroup;
} else {
throw new UnsupportedOperationException("Unsupported create array with default value.");
}
} else {
HeapArrayVector arrayVector = new HeapArrayVector(batchSize);
if (value == null) {
arrayVector.fillWithNulls();
return arrayVector;
} else {
throw new UnsupportedOperationException("Unsupported create array with default value.");
}
}
case MAP:
HeapMapColumnVector mapVector = new HeapMapColumnVector(batchSize, null, null);
if (value == null) {
mapVector.fillWithNulls();
return mapVector;
} else {
throw new UnsupportedOperationException("Unsupported create map with default value.");
}
case ROW:
HeapRowColumnVector rowVector = new HeapRowColumnVector(batchSize);
if (value == null) {
rowVector.fillWithNulls();
return rowVector;
} else {
throw new UnsupportedOperationException("Unsupported create row with default value.");
}
default:
throw new UnsupportedOperationException("Unsupported type: " + type);
}
}