31次主要版本更新

41.0.0 2024年8月11日
40.0.0 2024年7月12日
39.0.0 2024年6月10日
38.0.0 2024年5月10日
9.0.0 2022年6月13日

#55数据库接口

Download history 79926/week @ 2024-05-01 90958/week @ 2024-05-08 87671/week @ 2024-05-15 92227/week @ 2024-05-22 132102/week @ 2024-05-29 182623/week @ 2024-06-05 180205/week @ 2024-06-12 172546/week @ 2024-06-19 224500/week @ 2024-06-26 165100/week @ 2024-07-03 172847/week @ 2024-07-10 168768/week @ 2024-07-17 179328/week @ 2024-07-24 176612/week @ 2024-07-31 178818/week @ 2024-08-07 151318/week @ 2024-08-14

720,267 每月下载量
用于 119 个crate (9 直接)

Apache-2.0

2.5MB
47K SLoC

DataFusion SQL查询规划器

此crate提供了一款通用的SQL查询规划器,可以解析SQL并将查询转换为逻辑计划。尽管此crate被DataFusion查询引擎使用,但它被设计成易于从任何需要SQL查询规划器的项目中使用,并且不对结果逻辑计划如何转换为物理计划做任何假设。例如,在逻辑计划中没有基于行与基于列执行的概念。

使用示例

请参阅示例目录以获取完全工作的示例。

以下是从SQL字符串生成逻辑计划的示例。

fn main() {
    let sql = "SELECT \
            c.id, c.first_name, c.last_name, \
            COUNT(*) as num_orders, \
            SUM(o.price) AS total_price, \
            SUM(o.price * s.sales_tax) AS state_tax \
        FROM customer c \
        JOIN state s ON c.state = s.id \
        JOIN orders o ON c.id = o.customer_id \
        WHERE o.price > 0 \
        AND c.last_name LIKE 'G%' \
        GROUP BY 1, 2, 3 \
        ORDER BY state_tax DESC";

    // parse the SQL
    let dialect = GenericDialect {}; // or AnsiDialect, or your own dialect ...
    let ast = Parser::parse_sql(&dialect, sql).unwrap();
    let statement = &ast[0];

    // create a logical query plan
    let schema_provider = MySchemaProvider::new();
    let sql_to_rel = SqlToRel::new(&schema_provider);
    let plan = sql_to_rel.sql_statement_to_plan(statement.clone()).unwrap();

    // show the plan
    println!("{:?}", plan);
}

这是从示例生成的逻辑计划。请注意,这是一个未优化的逻辑计划。datafusion-optimizer crate提供了一款查询优化器,可以将此crate生成的计划进行优化。

Sort: state_tax DESC NULLS FIRST
  Projection: c.id, c.first_name, c.last_name, COUNT(Int64(1)) AS num_orders, SUM(o.price) AS total_price, SUM(o.price * s.sales_tax) AS state_tax
    Aggregate: groupBy=[[c.id, c.first_name, c.last_name]], aggr=[[COUNT(Int64(1)), SUM(o.price), SUM(o.price * s.sales_tax)]]
      Filter: o.price > Int64(0) AND c.last_name LIKE Utf8("G%")
        Inner Join: c.id = o.customer_id
          Inner Join: c.state = s.id
            SubqueryAlias: c
              TableScan: customer
            SubqueryAlias: s
              TableScan: state
          SubqueryAlias: o
            TableScan: orders

依赖项

~15–24MB
~342K SLoC