este problema se puede resolver de diversas formas, pero te compartimos la respuesta más completa para nosotros.
Solución:
Espero que te ayude
Analice la consulta dada usando el analizador Spark sql (Spark internamente hace lo mismo). Puede obtener sqlParser del estado de la sesión. Dará un plan lógico de consulta. Itere sobre el plan lógico de consulta y verifique si es una instancia de UnresolvedRelation (operador lógico de hoja para representar una referencia de tabla en un plan de consulta lógico que aún no se ha resuelto) y obtenga una tabla de él.
def getTables(query: String) : Seq[String] =
val logical : LogicalPlan = localsparkSession.sessionState.sqlParser.parsePlan(query)
val tables = scala.collection.mutable.LinkedHashSet.empty[String]
var i = 0
while (true)
if (logical(i) == null)
return tables.toSeq
else if (logical(i).isInstanceOf[UnresolvedRelation])
val tableIdentifier = logical(i).asInstanceOf[UnresolvedRelation].tableIdentifier
tables += tableIdentifier.unquotedString.toLowerCase
i = i + 1
tables.toSeq
Muchas gracias @Swapnil Chougule por la respuesta. Eso me inspiró a ofrecer una forma idiomática de recopilar todas las tablas en una consulta estructurada.
scala> spark.version
res0: String = 2.3.1
def getTables(query: String): Seq[String] =
val logicalPlan = spark.sessionState.sqlParser.parsePlan(query)
import org.apache.spark.sql.catalyst.analysis.UnresolvedRelation
logicalPlan.collect case r: UnresolvedRelation => r.tableName
val query = "select * from table_1 as a left join table_2 as b on a.id=b.id"
scala> getTables(query).foreach(println)
table_1
table_2
Si crees que te ha resultado de utilidad este artículo, sería de mucha ayuda si lo compartieras con el resto programadores y nos ayudes a dar difusión a este contenido.