Skip to content

Commit b3c2cb5

Browse files
authored
Merge pull request #7672 from sandflee/const2
feat(hive): use const column to represent hive partition data
2 parents 6b81a95 + 9947c1b commit b3c2cb5

File tree

1 file changed

+26
-33
lines changed

1 file changed

+26
-33
lines changed

src/query/storages/hive/src/hive_partition_filler.rs

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,13 @@
1414

1515
use std::sync::Arc;
1616

17-
use common_arrow::arrow::array::PrimitiveArray;
18-
use common_arrow::arrow::array::Utf8Array;
19-
use common_arrow::arrow::types::NativeType;
2017
use common_datablocks::DataBlock;
2118
use common_datavalues::ColumnRef;
19+
use common_datavalues::ConstColumn;
2220
use common_datavalues::DataField;
2321
use common_datavalues::DataTypeImpl;
24-
use common_datavalues::PrimitiveColumn;
25-
use common_datavalues::PrimitiveType;
26-
use common_datavalues::StringColumn;
22+
use common_datavalues::Series;
23+
use common_datavalues::SeriesFrom;
2724
use common_exception::ErrorCode;
2825
use common_exception::Result;
2926

@@ -34,45 +31,41 @@ pub struct HivePartitionFiller {
3431
pub partition_fields: Vec<DataField>,
3532
}
3633

34+
macro_rules! generate_primitive_column {
35+
($T:ty, $num_rows:expr, $value:expr) => {{
36+
let column = Series::from_data(vec![$value.parse::<$T>().unwrap()]);
37+
Ok(Arc::new(ConstColumn::new(column, $num_rows)))
38+
}};
39+
}
40+
41+
fn generate_string_column(num_rows: usize, value: String) -> Result<ColumnRef> {
42+
let column = Series::from_data(vec![value]);
43+
Ok(Arc::new(ConstColumn::new(column, num_rows)))
44+
}
45+
3746
impl HivePartitionFiller {
3847
pub fn create(partition_fields: Vec<DataField>) -> Self {
3948
HivePartitionFiller { partition_fields }
4049
}
4150

42-
fn generate_string_column(&self, num_rows: usize, value: String) -> Result<ColumnRef> {
43-
let column = vec![Some(value); num_rows];
44-
let arrow_array = Utf8Array::<i32>::from_iter(column);
45-
Ok(Arc::new(StringColumn::from_arrow_array(&arrow_array)) as ColumnRef)
46-
}
47-
48-
fn generate_primitive_column<T>(&self, num_rows: usize, value: String) -> Result<ColumnRef>
49-
where
50-
T: NativeType + std::str::FromStr + std::fmt::Debug + PrimitiveType,
51-
<T as std::str::FromStr>::Err: std::fmt::Debug,
52-
{
53-
let column = vec![Some(value.parse::<T>().unwrap()); num_rows];
54-
let arrow_array = PrimitiveArray::<T>::from_iter(column);
55-
Ok(Arc::new(PrimitiveColumn::<T>::from_arrow_array(&arrow_array)) as ColumnRef)
56-
}
57-
5851
fn generate_column(
5952
&self,
6053
num_rows: usize,
6154
value: String,
6255
field: &DataField,
6356
) -> Result<ColumnRef> {
6457
match field.data_type().clone() {
65-
DataTypeImpl::String(_) => self.generate_string_column(num_rows, value),
66-
DataTypeImpl::Int8(_) => self.generate_primitive_column::<i8>(num_rows, value),
67-
DataTypeImpl::Int16(_) => self.generate_primitive_column::<i16>(num_rows, value),
68-
DataTypeImpl::Int32(_) => self.generate_primitive_column::<i32>(num_rows, value),
69-
DataTypeImpl::Int64(_) => self.generate_primitive_column::<i64>(num_rows, value),
70-
DataTypeImpl::UInt8(_) => self.generate_primitive_column::<u8>(num_rows, value),
71-
DataTypeImpl::UInt16(_) => self.generate_primitive_column::<u16>(num_rows, value),
72-
DataTypeImpl::UInt32(_) => self.generate_primitive_column::<u32>(num_rows, value),
73-
DataTypeImpl::UInt64(_) => self.generate_primitive_column::<u64>(num_rows, value),
74-
DataTypeImpl::Float32(_) => self.generate_primitive_column::<f32>(num_rows, value),
75-
DataTypeImpl::Float64(_) => self.generate_primitive_column::<f64>(num_rows, value),
58+
DataTypeImpl::String(_) => generate_string_column(num_rows, value),
59+
DataTypeImpl::Int8(_) => generate_primitive_column!(i8, num_rows, value),
60+
DataTypeImpl::Int16(_) => generate_primitive_column!(i16, num_rows, value),
61+
DataTypeImpl::Int32(_) => generate_primitive_column!(i32, num_rows, value),
62+
DataTypeImpl::Int64(_) => generate_primitive_column!(i64, num_rows, value),
63+
DataTypeImpl::UInt8(_) => generate_primitive_column!(u8, num_rows, value),
64+
DataTypeImpl::UInt16(_) => generate_primitive_column!(u16, num_rows, value),
65+
DataTypeImpl::UInt32(_) => generate_primitive_column!(u32, num_rows, value),
66+
DataTypeImpl::UInt64(_) => generate_primitive_column!(u64, num_rows, value),
67+
DataTypeImpl::Float32(_) => generate_primitive_column!(f32, num_rows, value),
68+
DataTypeImpl::Float64(_) => generate_primitive_column!(f64, num_rows, value),
7669
_ => Err(ErrorCode::UnImplement(format!(
7770
"generate column failed, {:?}",
7871
field

0 commit comments

Comments
 (0)