apache-spark-sql - 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()
通话。我认为这将是一个简单的“是”或“否”类型的问题,但也许我的用例不在人迹罕至的地方。是时候亲自潜入它了...
解决方案
假设您有包含 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"))
同样,这不是经过测试的代码,但通常这是您获取列名及其类型的方式。
推荐阅读
- c++ - 在 C++ 中导入 dll 函数
- django - 我正在尝试在我的 django 项目中导入 gensim、pandas 和 numpy,但出现导入错误
- java - 如何修复 org.hibernate.MappingException 取消映射类
- php - Netbeans IDE 上的 PHP 7.3
- sql - SQL 聚合多个表中的数据并对指定列求和
- node.js - 如何将文本保存到语音音频文件客户端?
- bash - What is the best way to implement log rotation? (Node application)
- c++ - 是否可以动态地将函数分配给函数指针?
- angular - 当页面不活动时,RxJS 6 暂停或缓冲可观察
- javascript - How to get the value of a datepicker using framework7 and vuejs?