【问题标题】:Pyspark Equivalent of Pyodbc? [duplicate]Pyspark 等价于 Pyodbc? [复制]
【发布时间】:2018-05-12 03:30:56
【问题描述】:

我目前有以下 Python 代码可以将本地 SQL Server 数据库中的表读入 Pandas:

import pandas as pd
import pyodbc

# Connect to DB
server = 'server'
db = 'db'

conn = pyodbc.connect('DRIVER={SQL SERVER}; SERVER=' + server + '; DATABASE=' + db + '; TRUSTED_CONNECTION=yes')
cursor = conn.cursor()

table = 'table'
df = pd.read_sql('Select * From ' + table, conn)

该代码有效,但现在我想在 Pyspark 中做同样的事情。 Pyspark 中这段代码的等价物是什么?

我尝试了以下方法:

import findspark
import os
from pyspark.sql import SparkSession
from pyspark.sql.functions import *

# didn't know which of these would work so tried both
os.environ['SPARK_CLASSPATH'] = 'path/to/sqljdbc42.jar'
os.environ['driver-class-path'] = 'path/to/sqljdbc42.jar'

findspark.init('C:/spark/spark')

spark = SparkSession \
        .builder \
        .appName("SparkCoreTest") \
        .getOrCreate()

sc = spark.sparkContext
sqlctx = SQLContext(sc)

server = 'server'
db = 'db'
url = 'jdbc:sqlserver//' + server + ';databaseName=' + db
table = 'table'
properties = {'driver' : 'com.microsoft.sqlserver.jdbc.SQLServerDriver'}

df = sqlctx.read.format('jdbc').options(url=url, dbtable=table, driver='{SQL SERVER}').load()

这给出了java.lang.ClassNotFoundException: {SQL SERVER}。在整个过程中,我还遇到了由于无法找到“合适的驱动程序”而导致的错误,尽管我认为我已经通过更改os.environ 修复了这些错误。任何帮助将不胜感激!

【问题讨论】:

  • 您的意思显然是“pyspark 相当于 pyodbc”...

标签: python sql-server apache-spark pyspark pyodbc


【解决方案1】:

你很接近。 ClassNotFoundException 表示找不到驱动jar。

为了使用 MySQL、SQL Server 等的驱动程序,将 jars 放在一个可以从主服务器和从服务器访问的文件夹中很重要(如果你在本地运行 spark 就可以了),并且你需要指定使用 --jars 标志的罐子的位置,如下所示:

spark-submit --jars /path/to/sqljdbc42.jar ...other params... yourscript.py

或:

# create a configuration instance and set the spark.jars option
conf = SparkConf()
conf.set('spark.jars', '/path/to/sqljdbc42.jar')

# give that configuration to the spark session
spark = SparkSession.builder\
                    .config(conf=conf) \
                    .appName(app_name) \
                    .getOrCreate()

此外,您应该使用 spark session 而不是 SQLContext 直接从 sql server 读取(甚至认为这取决于您的 spark 版本):

df = spark.read.format('jdbc').options(url=url, dbtable=table).load()

(driver jar )

(注意:还有一种使用环境变量的方法,但我没有使用过)

希望这会有所帮助,祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2014-04-03
    • 2017-10-22
    • 2012-01-15
    • 2021-02-06
    相关资源
    最近更新 更多