Saltar al contenido

¿Cómo obtener nombres de tablas de una consulta SQL?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *