首页 > 解决方案 > Spark SQL 是否提供 API 来解析 SQL 语句和相应的 DDL 并推断选择列表的数据类型?

问题描述

我正在为一个项目审查 Spark SQL,我看到了我需要的所有 API(SQL Parser、Dataset、Encoder、LogicalPlan 等),但是我很难按照我想要的方式将它们联系在一起。

本质上我想要以下功能:

var ddl = parseDDL(RAW_DDL);
var query = parseQuery("SELECT c1, c2 FROM t1 WHERE c2='value'", ddl);
var selectFields = query.getSelectFields();
for(var field: selectFields) {
    var name = field.getName();
    var type = field.getType(); // <~~~ want this in terms of `t1` from ddl
    ...
}

就 DDL 而言,选择列表的类型信息是我所追求的。

理想情况下,如果可能的话,我想要一个使用 Spark SQL 的简单示例。

更新

为了澄清,假设我有一个包含多个CREATE TABLE语句的 SQL 模式文件:

文件:com/abc/MovieDb.sql

CREATE TABLE Movie (
    Title varchar(255),
    Year integer,
    etc.
);
CREATE TABLE Actor (
    FirstName varchar(255),
    LastName varchar(255),
    etc.
);
etc.

我想使用 Spark SQL 来解析一些针对这个模式的任意SQL SELECT 语句。重要的是,我想根据模式中的电影、演员等表和列获取有关每个查询的选择列表的类型信息。例如:

SELECT Title, Year FROM Movie WHERE Year > 1990

我想针对架构解析此查询并获取选择列表的类型信息。同样,查询是任意的,但是架构是稳定的,例如:

var parser = createParser(schema);
var query = parser.parseQuery(arbitraryQuery);
var selectedFields = query.getSelectedFields();
for (var field: selectedFields) {
    var name = field.getName();
    var type = field.getType();
}

最重要的是field.getType()通话。

我认为这将是一个简单的“是”或“否”类型的问题,但也许我的用例不在人迹罕至的地方。是时候亲自潜入它了...

标签: apache-spark-sql

解决方案


假设您有包含 A、B、C、D 列的数据框,可以在这里获取列信息

val  inputDf= Seq(("foo","Bar",0,0.0)).toDf("a","b","c","d")
val newDf = inputDf.select("a","c")
val columnInfo= newDf.dtypes // should give you something like (("a","StringType"),("c","IntegarType"))

同样,这不是经过测试的代码,但通常这是您获取列名及其类型的方式。


推荐阅读