Scala代码用于在另一列中有逗号时拆分选择SQL查询

yh2wf1be  于 6个月前  发布在  Scala
关注(0)|答案(1)|浏览(85)

我选择查询如下:

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条件下,这仍然是基于(“,”)拆分列,这不是我期望的理想情况

brc7rcf0

brc7rcf01#

根据Gaël J,你应该使用一个正确的解析器和一个SQL语法,或者,如果你可以使用内部结构,直接使用Spark解析器并询问结果树/计划。
在Spark中,这是一个你正在寻找的投影,为了简化,你可以将第一个查询 Package 在“select * from()”中,以确保你得到一个更简单的解析。

import org.apache.spark.sql.execution.SparkSqlParser
/* parsers can only be constructed in a valid session */
val parser = SparkSession.getActiveSession.map(_.sessionState.sqlParser).getOrElse {
      new SparkSqlParser()
    }
/* an issue when parsing is thrown rather than Either/Try etc. */
    val plan =
      try {
        parser.parsePlan(theSqlString)
...

字符串
计划树一开始可能很难浏览,但它几乎是一个完整的语法,如果它的目标用途是Spark,无论如何,它都是该用例的理想选择。
要知道,直到计划被分析等,你将有一切“未定义”和“未解决”,但它足以读取函数,属性名称等。
它不会为你做的是,如果有一个没有用户定义名称的函数调用,它会自动处理投影名称的创建。同样,它不会验证SQL是否实际可用(例如,使用的字段实际存在于SQL中,或者SQL甚至会运行),它只验证SQL是否有机会运行。
处理相关子查询的示例用法

相关问题