in odps-sdk/odps-sdk-core/src/main/java/com/aliyun/odps/table/record/accessor/ArrowToRecordConverter.java [147:219]
public static Object getData(ArrowVectorAccessor dataAccessor, TypeInfo typeInfo, int rowId,
boolean isExtension)
throws IOException {
if (dataAccessor.isNullAt(rowId)) {
return null;
}
switch (typeInfo.getOdpsType()) {
case BOOLEAN:
return ((ArrowBitAccessor) dataAccessor).getBoolean(rowId);
case TINYINT:
return ((ArrowTinyIntAccessor) dataAccessor).getByte(rowId);
case SMALLINT:
return ((ArrowSmallIntAccessor) dataAccessor).getShort(rowId);
case INT:
return ((ArrowIntAccessor) dataAccessor).getInt(rowId);
case BIGINT:
return ((ArrowBigIntAccessor) dataAccessor).getLong(rowId);
case FLOAT:
return ((ArrowFloat4Accessor) dataAccessor).getFloat(rowId);
case DOUBLE:
return ((ArrowFloat8Accessor) dataAccessor).getDouble(rowId);
case DECIMAL:
if (isExtension && (dataAccessor instanceof ArrowDecimalExtensionAccessor)) {
return ((ArrowDecimalExtensionAccessor) dataAccessor).getDecimal(rowId);
} else {
return ((ArrowDecimalAccessor) dataAccessor).getDecimal(rowId);
}
case STRING:
return ((ArrowVarCharAccessor) dataAccessor).getBytes(rowId);
case VARCHAR:
return new Varchar(new String(((ArrowVarCharAccessor) dataAccessor).getBytes(rowId),
ConfigConstants.DEFAULT_CHARSET));
case CHAR:
return new Char(new String(((ArrowVarCharAccessor) dataAccessor).getBytes(rowId),
ConfigConstants.DEFAULT_CHARSET));
case BINARY:
return new Binary(((ArrowVarBinaryAccessor) dataAccessor).getBinary(rowId));
case DATE:
return LocalDate.ofEpochDay(((ArrowDateDayAccessor) dataAccessor).getEpochDay(rowId));
case DATETIME:
return convertToTimeStamp(((ArrowTimestampAccessor) dataAccessor).getType(),
((ArrowTimestampAccessor) dataAccessor).getEpochTime(
rowId)).atZone(ZoneId.systemDefault());
case TIMESTAMP:
if (!isExtension) {
return convertToTimeStamp(((ArrowTimestampAccessor) dataAccessor).getType(),
((ArrowTimestampAccessor) dataAccessor).getEpochTime(rowId));
} else {
return ((ArrowTimestampExtensionAccessor) dataAccessor).getTimestamp(rowId);
}
case TIMESTAMP_NTZ:
if (!isExtension) {
return convertToTimeStampNtz(((ArrowTimestampAccessor) dataAccessor).getType(),
((ArrowTimestampAccessor) dataAccessor).getEpochTime(rowId));
} else {
return ((ArrowTimestampExtensionAccessor) dataAccessor).getTimestampNtz(rowId);
}
case JSON:
return new SimpleJsonValue(
new String(((ArrowVarCharAccessor) dataAccessor).getBytes(rowId)));
case ARRAY:
return (((ArrowArrayAccessorImpl.ArrowArrayAccessorForRecord) dataAccessor)).getArray(
rowId);
case MAP:
return (((ArrowMapAccessorImpl.ArrowMapAccessorForRecord) dataAccessor)).getMap(rowId);
case STRUCT:
return (((ArrowStructAccessorImpl.ArrowStructAccessorForRecord) dataAccessor)).getStruct(
rowId);
default:
throw new UnsupportedOperationException(
"Datatype not supported: " + typeInfo.getTypeName());
}
}