我正在使用pyspark从mysql获取数据,它只用于一个表。我想从mysql数据库中获取所有表。不想一次又一次地调用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")发布于 2019-02-04 21:07:31
您需要以某种方式获取您在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。
发布于 2020-06-18 12:28:30
@Steven已经给出了一个完美的答案。正如他所说的,为了查找表名的Python列表,您可以使用:
#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']注意,这是在PostgreSQL中实现的。您可以轻松地更改url和driver参数。
https://stackoverflow.com/questions/54493740
复制相似问题