如何使用Spark SQL列出数据库中的所有表?

时间:2017-03-18 21:30:45

标签: apache-spark pyspark apache-spark-sql

我有一个与外部数据库的SparkSQL连接:

from pyspark.sql import SparkSession

spark = SparkSession \
  .builder \
  .appName("Python Spark SQL basic example") \
  .getOrCreate()

如果我知道表格的名称,那么很容易查询。

users_df = spark \
  .read.format("jdbc") \
  .options(dbtable="users", **db_config) \
  .load()

但有没有一种列出/发现表的好方法?

我希望在mysql中等效SHOW TABLES,或在postgres中使用\dt

我正在使用pyspark v2.1,以防万一。

1 个答案:

答案 0 :(得分:8)

这个问题的答案实际上并不具体。您只需加载information_schema.tables

信息模式由一组视图组成,这些视图包含有关当前数据库中定义的对象的信息。信息模式在SQL标准中定义,因此可以预期是可移植的并且保持稳定 - 与系统目录不同,系统目录特定于RDBMS并且在实现问题之后建模。

我将使用MySQL作为我的代码段,其中包含一个enwiki数据库,我想在其中列出表格:

# read the information schema table 
spark.read.format('jdbc'). \
     options(
         url='jdbc:mysql://localhost:3306/', # database url (local, remote)
         dbtable='information_schema.tables',
         user='root',
         password='root',
         driver='com.mysql.jdbc.Driver'). \
     load(). \
     filter("table_schema = 'enwiki'"). \ # filter on specific database.
     show()
# +-------------+------------+----------+----------+------+-------+----------+----------+--------------+-----------+---------------+------------+----------+--------------+--------------------+-----------+----------+---------------+--------+--------------+-------------+
# |TABLE_CATALOG|TABLE_SCHEMA|TABLE_NAME|TABLE_TYPE|ENGINE|VERSION|ROW_FORMAT|TABLE_ROWS|AVG_ROW_LENGTH|DATA_LENGTH|MAX_DATA_LENGTH|INDEX_LENGTH| DATA_FREE|AUTO_INCREMENT|         CREATE_TIME|UPDATE_TIME|CHECK_TIME|TABLE_COLLATION|CHECKSUM|CREATE_OPTIONS|TABLE_COMMENT|
# +-------------+------------+----------+----------+------+-------+----------+----------+--------------+-----------+---------------+------------+----------+--------------+--------------------+-----------+----------+---------------+--------+--------------+-------------+
# |          def|      enwiki|      page|BASE TABLE|InnoDB|     10|   Compact|   7155190|           115|  828375040|              0|   975601664|1965031424|      11359093|2017-01-23 08:42:...|       null|      null|         binary|    null|              |             |
# +-------------+------------+----------+----------+------+-------+----------+----------+--------------+-----------+---------------+------------+----------+--------------+--------------------+-----------+----------+---------------+--------+--------------+-------------+

注意:此解决方案可以应用于受尊重语言约束的scala和java。