pyspark在databricks上的数据库中查找具有特定列名称的表

pb3s4cty  于 2021-06-25  发布在  Hive
关注(0)|答案(2)|浏览(322)

我想通过pysparksql在databricks上的数据库中查找具有特定列的表。
我使用以下代码,但它不工作。https://medium.com/@rajnishkumargarg/find-all-the-tables-by-column-name-in-hive-51caebb94832
在sql server上我的代码:

SELECT Table_Name, Column_Name 
   FROM INFORMATION_SCHEMA.COLUMNS
   WHERE TABLE_CATALOG = 'YOUR_DATABASE'
   AND COLUMN_NAME LIKE '%YOUR_COLUMN%'

但是,我不知道如何在pysparksql上做同样的事情?
谢谢

qeeaahzv

qeeaahzv1#

sparksession有一个属性目录。此目录的方法listtables返回sparksession已知的所有表的列表。使用此列表,您可以使用listcolumns查询每个表的所有列

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("test").getOrCreate()

spark.sql("CREATE TABLE tab1 (name STRING, age INT) USING parquet")
spark.sql("CREATE TABLE tab2 (name STRING, age INT) USING parquet")
spark.sql("CREATE TABLE tab3 (street STRING, age INT) USING parquet")

for table in spark.catalog.listTables():
    for column in spark.catalog.listColumns(table.name):
        if column.name == 'name':
            print('Found column {} in table {}'.format(column.name, table.name))

印刷品

Found column name in table tab1
Found column name in table tab2

两种方法, listTables 以及 listColumns 如果要将搜索限制为单个数据库,请接受数据库名称作为可选参数。

wqnecbli

wqnecbli2#

正如沃纳提到的,sparksession确实具有目录属性。
如果我理解正确,您希望得到具有特定列的表。您可以尝试以下代码(很抱歉用scala代码代替python):

val databases = spark.catalog.listDatabases().select($"name".as("db_name")).as("databases")
  val tables = spark.catalog.listTables().select($"name".as("table_name"), $"database").as("tables")
  val tablesWithDatabase = databases.join(tables, $"databases.db_name" === $"tables.database", "inner").collect()
  tablesWithDatabase.foreach(row => {
    val dbName = row.get(0).asInstanceOf[String]
    val tableName = row.get(1).asInstanceOf[String]
    val columns = spark.catalog.listColumns(dbName, tableName)
    columns.foreach(column=>{
      if (column.name == "Your column")
        // Do your logic here
        null
    })
  })

请注意,我这样做collect如果您有很多表/数据库,它可能会导致oom错误,我这样做collect的原因是,与listtables或listdatabases方法相比,listcolumns需要获得dbname和tablename,并且它没有任何与表匹配的唯一列id。
因此,该列的搜索将在驱动程序的本地完成。
希望这有帮助。

相关问题