Sql 查找具有特定列的表';pyspark提供的databricks上数据库中的名称
我希望通过pysparksql在databricks上的数据库中查找具有特定列的表 我使用以下代码,但它不起作用。 在SQL server上,我的代码:Sql 查找具有特定列的表';pyspark提供的databricks上数据库中的名称,sql,database,apache-spark,hive,pyspark,Sql,Database,Apache Spark,Hive,Pyspark,我希望通过pysparksql在databricks上的数据库中查找具有特定列的表 我使用以下代码,但它不起作用。 在SQL server上,我的代码: SELECT Table_Name, Column_Name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = 'YOUR_DATABASE' AND COLUMN_NAME LIKE '%YOUR_COLUMN%' 但是,我不知道如何在pysparksql
SELECT Table_Name, Column_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_CATALOG = 'YOUR_DATABASE'
AND COLUMN_NAME LIKE '%YOUR_COLUMN%'
但是,我不知道如何在pysparksql上做同样的事情
谢谢有一个属性。此目录的方法返回SparkSession已知的所有表的列表。使用此列表,您可以使用
从pyspark.sql导入SparkSession
spark=SparkSession.builder.appName(“测试”).getOrCreate()
sql(“使用拼花地板创建表tab1(名称字符串,年龄INT))
sql(“使用拼花地板创建表tab2(名称字符串,年龄INT))
sql(“使用拼花地板创建表tab3(street字符串,age INT))
对于spark.catalog.listTables()中的表:
对于spark.catalog.listColumns(table.name)中的列:
如果column.name==“name”:
打印('在表{}中找到列{}'。格式(column.name,table.name))
印刷品
在表tab1中找到列名
在表tab2中找到列名
如果要将搜索限制为单个数据库,则
listTables
和listColumns
这两种方法都接受数据库名称作为可选参数。SparkSession确实具有werner提到的catalog属性
如果我理解正确,您希望得到具有特定列的表。
您可以尝试以下代码(很抱歉使用scala代码代替python):
请注意,如果您有很多表/数据库,我会这样做collect,这可能会导致OOM错误,我这样做collect的原因是,与listTables或listDatabases方法相比,listColumns需要获取dbName和tableName,而且它并没有任何唯一的列id与表匹配
因此,列的搜索将在驱动程序上本地完成
希望这有帮助。我遇到了与OP类似的问题,我需要找到所有与LIKE子句匹配的列,包括嵌套列 我在这里写了一篇关于它的帖子 但是您可以在下面找到完整的代码 与前面的答案相比,此解决方案的好处在于,如果您需要搜索由OP编写的“%”之类的列,它就可以工作。此外,它还允许您在嵌套字段中搜索名称。最后,它创建了一个类似SQL的视图,类似于信息模式视图
from pyspark.sql.types import StructType
# get field name from schema (recursive for getting nested values)
def get_schema_field_name(field, parent=None):
if type(field.dataType) == StructType:
if parent == None:
prt = field.name
else:
prt = parent+"."+field.name # using dot notation
res = []
for i in field.dataType.fields:
res.append(get_schema_field_name(i, prt))
return res
else:
if parent==None:
res = field.name
else:
res = parent+"."+field.name
return res
# flatten list, from https://stackoverflow.com/a/12472564/4920394
def flatten(S):
if S == []:
return S
if isinstance(S[0], list):
return flatten(S[0]) + flatten(S[1:])
return S[:1] + flatten(S[1:])
# list of databases
db_list = [x[0] for x in spark.sql("SHOW DATABASES").rdd.collect()]
for i in db_list:
spark.sql("SHOW TABLES IN {}".format(i)).createOrReplaceTempView(str(i)+"TablesList")
# create a query for fetching all tables from all databases
union_string = "SELECT database, tableName FROM "
for idx, item in enumerate(db_list):
if idx == 0:
union_string += str(item)+"TablesList WHERE isTemporary = 'false'"
else:
union_string += " UNION ALL SELECT database, tableName FROM {}".format(str(item)+"TablesList WHERE isTemporary = 'false'")
spark.sql(union_string).createOrReplaceTempView("allTables")
# full list = schema, table, column
full_list = []
for i in spark.sql("SELECT * FROM allTables").collect():
table_name = i[0]+"."+i[1]
table_schema = spark.sql("SELECT * FROM {}".format(table_name))
column_list = []
for j in table_schema.schema:
column_list.append(get_schema_field_name(j))
column_list = flatten(column_list)
for k in column_list:
full_list.append([i[0],i[1],k])
spark.createDataFrame(full_list, schema = ['database', 'tableName', 'columnName']).createOrReplaceTempView("allColumns")```
谢谢,但是如何指定列的名称呢?你是对的,我忘记了列的部分。但现在已经添加了
from pyspark.sql.types import StructType
# get field name from schema (recursive for getting nested values)
def get_schema_field_name(field, parent=None):
if type(field.dataType) == StructType:
if parent == None:
prt = field.name
else:
prt = parent+"."+field.name # using dot notation
res = []
for i in field.dataType.fields:
res.append(get_schema_field_name(i, prt))
return res
else:
if parent==None:
res = field.name
else:
res = parent+"."+field.name
return res
# flatten list, from https://stackoverflow.com/a/12472564/4920394
def flatten(S):
if S == []:
return S
if isinstance(S[0], list):
return flatten(S[0]) + flatten(S[1:])
return S[:1] + flatten(S[1:])
# list of databases
db_list = [x[0] for x in spark.sql("SHOW DATABASES").rdd.collect()]
for i in db_list:
spark.sql("SHOW TABLES IN {}".format(i)).createOrReplaceTempView(str(i)+"TablesList")
# create a query for fetching all tables from all databases
union_string = "SELECT database, tableName FROM "
for idx, item in enumerate(db_list):
if idx == 0:
union_string += str(item)+"TablesList WHERE isTemporary = 'false'"
else:
union_string += " UNION ALL SELECT database, tableName FROM {}".format(str(item)+"TablesList WHERE isTemporary = 'false'")
spark.sql(union_string).createOrReplaceTempView("allTables")
# full list = schema, table, column
full_list = []
for i in spark.sql("SELECT * FROM allTables").collect():
table_name = i[0]+"."+i[1]
table_schema = spark.sql("SELECT * FROM {}".format(table_name))
column_list = []
for j in table_schema.schema:
column_list.append(get_schema_field_name(j))
column_list = flatten(column_list)
for k in column_list:
full_list.append([i[0],i[1],k])
spark.createDataFrame(full_list, schema = ['database', 'tableName', 'columnName']).createOrReplaceTempView("allColumns")```