如何使用 spark sql 获取多个表
how to fetch multiple tables using spark sql
我正在使用 pyspark 从 mysql 获取数据,只有一个 table.I 想要从 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")
您需要以某种方式获取您在 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
@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
参数。
我正在使用 pyspark 从 mysql 获取数据,只有一个 table.I 想要从 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")
您需要以某种方式获取您在 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
@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
参数。