Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找具有特定列的表';pyspark提供的databricks上数据库中的名称_Sql_Database_Apache Spark_Hive_Pyspark - Fatal编程技术网

Sql 查找具有特定列的表';pyspark提供的databricks上数据库中的名称

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

我希望通过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上做同样的事情

谢谢

有一个属性。此目录的方法返回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")```