行列混存|parallel hint|UDF|Spark DataSourceV2读取Doris存储格式

Viewed 25

Doris有几个技术问题,想咨询一下大佬:
1、行列混存,可以指定字段进行行存吗?类似hbase的column family。

2、并行度调优,可以简化像Oracle的parallel()hint吗?

3、sql function如何实现?在create function中编写sql,可以将一些表值返回一些正则表达式的values。在执行计划生成时,将function编译成具体的值,提升非等值join的rlike条件性能。

4、where子句中小表子查询在执行计划期间将单表单字段group_concat()子查询作用的结果直接生成执行计划期间的谓词表达式,是否可以实现?同问题3的业务场景。

5、doris在存算分离模式下,是否支持spark datasourceV2接口,直接读取doris内部存储格式。有没有相关的研发计划?

2 Answers
  1. Doris 支持行列混存,通过两个表属性来控制行列混存 store_row_column和
    row_store_columns 指定需要以行格式存储的列名列表

  2. 支持sql hint :SELECT /*+ SET_VAR(parallel_pipeline_task_num=8) */ * FROM table;

  3. 支持JAVA UDF,以及别名函数,具体您可以举个例子

  4. 这个看着像runtime filter 的特性,应该也是支持的

  5. 目前没有

3.类似于PL/PGSQL,以下是简单的函数例子,实际上业务更复杂,可能是通过复杂的逻辑计算得出一个标量值。
-- 获取当前日期的 yyyyMMdd 格式
CREATE OR REPLACE FUNCTION get_current_yyyymmdd()
RETURNS VARCHAR(8) AS $$
BEGIN
RETURN TO_CHAR(CURRENT_DATE, 'YYYYMMDD');
END;
$$ LANGUAGE plpgsql STABLE;

-- 获取 n 天前/后的 yyyyMMdd
CREATE OR REPLACE FUNCTION get_relative_yyyymmdd(days_offset INT)
RETURNS VARCHAR(8) AS $$
BEGIN
RETURN TO_CHAR(CURRENT_DATE + days_offset, 'YYYYMMDD');
END;
$$ LANGUAGE plpgsql STABLE;

-- 创建测试表
CREATE TABLE IF NOT EXISTS sales (
sale_id SERIAL PRIMARY KEY,
sale_date DATE,
sale_date_str VARCHAR(8) GENERATED ALWAYS AS (TO_CHAR(sale_date, 'YYYYMMDD')) STORED,
amount DECIMAL(10,2)
);

-- 插入测试数据
INSERT INTO sales (sale_date, amount)
SELECT
CURRENT_DATE - (n || ' days')::INTERVAL,
RANDOM() * 1000
FROM generate_series(0, 365) n;

-- 示例查询:动态日期范围查询
SELECT
sale_date_str,
SUM(amount) as total_amount
FROM sales
WHERE sale_date_str BETWEEN
get_relative_yyyymmdd(-30) AND get_current_yyyymmdd()
GROUP BY sale_date_str
ORDER BY sale_date_str DESC;

其中get_relative_yyyymmdd和get_current_yyyymmdd可以在生成执行计划期间直接优化编译成具体的值。