pyspark 如何查看数据库中的所有数据库和表

91zkwejq  于 2023-03-17  发布在  Spark
关注(0)|答案(2)|浏览(211)

我想列出Azure数据块中每个数据库中的所有表。
所以我希望输出看起来像这样:

Database | Table_name
Database1 | Table_1
Database1 | Table_2
Database1 | Table_3
Database2 | Table_1
etc..

这是我目前的情况:

from pyspark.sql.types import *

DatabaseDF = spark.sql(f"show databases")
df = spark.sql(f"show Tables FROM {DatabaseDF}")
#df = df.select("databaseName")
#list = [x["databaseName"] for x in df.collect()]

print(DatabaseDF)
display(DatabaseDF)

df = spark.sql(f"show Tables FROM {schemaName}")
df = df.select("TableName")
list = [x["TableName"] for x in df.collect()]

## Iterate through list of schema
for x in list:
###  INPUT Required: Change for target table
    tempTable = x
    df2 = spark.sql(f"SELECT COUNT(*) FROM {schemaName}.{tempTable}").collect()
    for x in df2:
      rowCount = x[0]
      
    if rowCount == 0:
      print(schemaName + "." + tempTable + " has 0 rows")

但我还没得到结果。

gkl3eglg

gkl3eglg1#

有一个catalog属性可以激发会话,可能是您正在寻找的:

spark.catalog.listDatabases()
spark.catalog.listTables("database_name")

listDatabases返回您拥有的数据库列表。
listTables返回特定数据库名称的表列表。
你可以这样做,例如:

[
    (table.database, table.name)
    for database in spark.catalog.listDatabases()
    for table in spark.catalog.listTables(database.name)
]

以获取数据库和表的列表。
编辑:(thx @Alex Ott)即使这个解决方案工作正常,也相当慢。直接使用一些sql命令,如show databasesshow tables in ...,应该会更快。

2lpgd968

2lpgd9682#

from pyspark.sql import SparkSession

# create a SparkSession
spark = SparkSession.builder.appName("ShowTablesInfo").getOrCreate()

# set the database
spark.catalog.setCurrentDatabase("default")

# get all tables
tables = spark.catalog.listTables()

# loop through tables and display database, table, and location
for table in tables:
    database = table.database
    name = table.name
    location = spark.sql(f"DESCRIBE EXTENDED {name}").filter("Location").select("data_type").collect()[0][0]
    print(f"Database: {database}, Table: {name}, Location: {location}")

# stop the SparkSession
spark.stop()

相关问题