我有一个与外部数据库的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,以防万一。
答案 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。