我选择查询如下:
select id, name as emp_name, case when coalesce(sal,0)=0 then 0 else 1 end as emp_sal from employee;
字符串
我想让你写一段scala代码,在代码中查询被分解成列的列表,如果我基于“,”进行拆分,那么条件“,”就是将列分解成两个
当它进入for循环时,我得到了什么:
"id"
"name as emp_name"
"case when coalesce(sal"
"0)=0 then 0 else 1 end as emp_sal"
型
当它进入for循环时的预期结果:
"id"
"name as emp_name"
"case when coalesce(sal,0)=0 then 0 else 1 end as emp_sal"
型
这是我的代码片段//你的SQL查询
瓦尔sqlQuery =“select id,name as emp_name,case when coalesce(sal,0)=0 then 0 else 1 end as emp_sal from employee”
//提取“select”和“from”之间的部分
瓦尔selectPart = sqlQuery.split(“(?i)select“)(1).split(“(?i)from”)(0).trim
//将选择部分拆分为单独的列,同时保留复杂的表达式
瓦尔columns = selectPart.split(“,”).map(_.trim)
//遍历列并打印它们
for(column <- columns){ println(s"$column”)}
但正如所说,即使在case条件下,这仍然是基于(“,”)拆分列,这不是我期望的理想情况
1条答案
按热度按时间brc7rcf01#
根据Gaël J,你应该使用一个正确的解析器和一个SQL语法,或者,如果你可以使用内部结构,直接使用Spark解析器并询问结果树/计划。
在Spark中,这是一个你正在寻找的投影,为了简化,你可以将第一个查询 Package 在“select * from()”中,以确保你得到一个更简单的解析。
字符串
计划树一开始可能很难浏览,但它几乎是一个完整的语法,如果它的目标用途是Spark,无论如何,它都是该用例的理想选择。
要知道,直到计划被分析等,你将有一切“未定义”和“未解决”,但它足以读取函数,属性名称等。
它不会为你做的是,如果有一个没有用户定义名称的函数调用,它会自动处理投影名称的创建。同样,它不会验证SQL是否实际可用(例如,使用的字段实际存在于SQL中,或者SQL甚至会运行),它只验证SQL是否有机会运行。
处理相关子查询的示例用法