Предполагая, что вы используете расширенный шаблон 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>