我正在尝试通过数据块中的jdbc连接查询SQL数据库,并将查询结果存储为pandas数据框。我可以在此在线找到的所有方法都涉及先使用Scala代码将其存储为一种Spark对象,然后再将其转换为熊猫。我尝试了单元格1:
%scala
val df_table1 = sqlContext.read.format("jdbc").options(Map(
("url" -> "jdbc:sqlserver://myserver.database.windows.net:1433;database=mydb"),
("dbtable" -> "(select top 10 * from myschema.table) as table"),
("user" -> "user"),
("password" -> "password123"),
("driver" -> "com.microsoft.sqlserver.jdbc.SQLServerDriver"))
).load()
其结果是:
df_table1: org.apache.spark.sql.DataFrame = [var1: int, var2: string ... 50 more fields]
太好了!但是,当我尝试将其转换为单元格2中的pandas df时,可以使用它:
import numpy as np
import pandas as pd
result_pdf = df_table1.select("*").toPandas()
print(result_pdf)
它生成错误消息:
NameError: name 'df_table1' is not defined
我如何成功地将此对象转换为pandas数据框,或者可以使用python代码通过jdbc连接查询SQL数据库,而根本不需要使用Scala(我不特别喜欢Scala语法,宁愿避免如果可能的话)?
我假设您打算使用python查询SQL,如果是这样,下面的查询将起作用。
%python
from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession
conf = SparkConf()
conf.setMaster("local").setAppName("My app")
sc = SparkContext.getOrCreate(conf=conf)
spark = SparkSession(sc)
database = "YourDBName"
table = "[dbo].[YourTabelName]"
user = "SqlUser"
password = "SqlPassword"
DF = spark.read.format("jdbc") \
.option("url", f"jdbc:sqlserver://YourAzureSql.database.windows.net:1433;databaseName={database};") \
.option("dbtable", table) \
.option("user", user) \
.option("password", password) \
.option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
.load()
DF.show()