我正在使用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")
答案 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']
参数。