如何使用Spark SQL获取多个表

时间:2019-02-02 13:57:47

标签: python pyspark-sql

我正在使用pyspark从mysql获取数据,仅用于一个表。我想从mysql db获取所有表。不想一次又一次调用jdbc连接。参见下面的代码

是否可以简化我的代码?预先谢谢你

url = "jdbc:mysql://localhost:3306/dbname"
table_df=sqlContext.read.format("jdbc").option("url",url).option("dbtable","table_name").option("user","root").option("password", "root").load()
sqlContext.registerDataFrameAsTable(table_df, "table1")

table_df_1=sqlContext.read.format("jdbc").option("url",url).option("dbtable","table_name_1").option("user","root").option("password", "root").load()
sqlContext.registerDataFrameAsTable(table_df_1, "table2")

2 个答案:

答案 0 :(得分:0)

您需要以某种方式获取mysql中具有的表的列表。 您可以找到一些sql命令来执行此操作,或者手动创建一个包含所有内容的文件。

然后,假设您可以在python tablename_list中创建表名列表,则可以像这样简单地循环遍历它:

url = "jdbc:mysql://localhost:3306/dbname"
reader = sqlContext.read.format("jdbc").option("url",url).option("user","root").option("password", "root")
for tablename in tablename_list:
    reader.option("dbtable",tablename).load().createTempView(tablename)

这将创建一个具有相同表名的临时视图。如果要使用其他名称,则可以使用元组列表(tablename_in_mysql,tablename_in_spark)更改初始tablename_list。

答案 1 :(得分:0)

@Steven已经给出了完美的答案。正如他所说,要查找表名的Python列表,可以使用:

y(a,b,c,...)

请注意,这是在PostgreSQL中。您可以轻松更改y(a,b,c,...)#list of the tables in the server table_names_list = spark.read.format('jdbc'). \ options( url='jdbc:postgresql://localhost:5432/', # database url (local, remote) dbtable='information_schema.tables', user='YOUR_USERNAME', password='YOUR_PASSWORD', driver='org.postgresql.Driver'). \ load().\ filter("table_schema = 'public'").select("table_name") #DataFrame[table_name: string] # table_names_list.collect() # [Row(table_name='employee'), Row(table_name='bonus')] table_names_list = [row.table_name for row in table_names_list.collect()] print(table_names_list) # ['employee', 'bonus'] 参数。