假设您使用扩展的 SQL 模板,例如 select a,b,c from tab,您可以执行以下操作来获得所需的结果。
- 获取sql字符串并将其转换为小写。
- 用空格或逗号分割 sql 以获得数组中的单个单词
- 从上述数组中删除“select”和“from”,因为它们是 SQL 关键字。
- 现在您的最后一个索引是表名
- 第一个到最后一个索引,但一个包含选择列的列表。
- 要获得所需的列,只需根据 df2.columns 对其进行过滤。 SQL 中有但表中没有的列将被过滤掉
- 现在使用各个部分构建 sql。
- 使用 spark.sql(reqd_sel_string) 运行它以获得结果。
看看这个
scala> val df2 = Seq((51,42),(51,42),(89,44)).toDF("store","prod")
df2: org.apache.spark.sql.DataFrame = [store: int, prod: int]
scala> df2.createOrReplaceTempView("tab2")
scala> val sel_query="Select store, prod, distance from tab2".toLowerCase
sel_query: String = select store, prod, distance from tab2
scala> val tabl_parse = sel_query.split("[ ,]+").filter(_!="select").filter(_!="from")
tabl_parse: Array[String] = Array(store, prod, distance, tab2)
scala> val tab_name=tabl_parse(tabl_parse.size-1)
tab_name: String = tab2
scala> val tab_cols = (0 until tabl_parse.size-1).map(tabl_parse(_))
tab_cols: scala.collection.immutable.IndexedSeq[String] = Vector(store, prod, distance)
scala> val reqd_cols = tab_cols.filter( x=>df2.columns.contains(x))
reqd_cols: scala.collection.immutable.IndexedSeq[String] = Vector(store, prod)
scala> val reqd_sel_string = "select " + reqd_cols.mkString(",") + " from " + tab_name
reqd_sel_string: String = select store,prod from tab2
scala> spark.sql(reqd_sel_string).show(false)
+-----+----+
|store|prod|
+-----+----+
|51 |42 |
|51 |42 |
|89 |44 |
+-----+----+
scala>