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



我正在为一个项目审查Spark SQL,我看到了我需要的API的所有部分(SQL解析器,数据集,编码器,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()电话。

我认为这将是一个简单的是或否类型的问题,但也许我的用例不走寻常路。是时候自己潜入其中了...

在这里获取列信息是可以做的 假设您有包含列 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"))

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

最新更新