【问题标题】:Using pyspark to connect to PostgreSQL使用 pyspark 连接 PostgreSQL
【发布时间】:2016-04-29 03:31:57
【问题描述】:

我正在尝试使用 pyspark 连接到数据库,并且正在使用以下代码:

sqlctx = SQLContext(sc)
df = sqlctx.load(
    url = "jdbc:postgresql://[hostname]/[database]",
    dbtable = "(SELECT * FROM talent LIMIT 1000) as blah",
    password = "MichaelJordan",
    user =  "ScottyPippen",
    source = "jdbc",
    driver = "org.postgresql.Driver"
)

我收到以下错误:

知道为什么会这样吗?

编辑:我正在尝试在我的计算机上本地运行代码。

【问题讨论】:

    标签: postgresql apache-spark pyspark


    【解决方案1】:

    https://jdbc.postgresql.org/download.html下载PostgreSQL JDBC驱动

    然后用你的替换数据库配置值。

    from pyspark.sql import SparkSession
    
    spark = SparkSession \
        .builder \
        .appName("Python Spark SQL basic example") \
        .config("spark.jars", "/path_to_postgresDriver/postgresql-42.2.5.jar") \
        .getOrCreate()
    
    df = spark.read \
        .format("jdbc") \
        .option("url", "jdbc:postgresql://localhost:5432/databasename") \
        .option("dbtable", "tablename") \
        .option("user", "username") \
        .option("password", "password") \
        .option("driver", "org.postgresql.Driver") \
        .load()
    
    df.printSchema()
    

    更多信息:https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html

    【讨论】:

    • 这个有效!我在 jupyter 实验室运行我的代码。我尝试停止并重新启动spark 会话,但它没有加载。当我重新启动 jupyter 内核时,它工作了!
    • 它对我不起作用,它仍然给出 "java.lang.ClassNotFoundException: org.postgresql.Driver" 任何想法?
    • 对我来说,它给出了以下错误:: org.postgresql.util.PSQLException: Connection to localhost:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.我的 postgres db 有一个名称。而且我没有看到将其包含在语法中的选项。但是,当我使用 psycopg2 库时,它可以工作。有什么办法可以让火花直接连接?
    【解决方案2】:

    以下内容对我在本地主机上的 postgres 有效:

    https://jdbc.postgresql.org/download.html 下载 PostgreSQL JDBC 驱动程序。

    对于pyspark shell,您使用SPARK_CLASSPATH 环境变量:

    $ export SPARK_CLASSPATH=/path/to/downloaded/jar
    $ pyspark
    

    要通过spark-submit 提交脚本,请使用--driver-class-path 标志:

    $ spark-submit --driver-class-path /path/to/downloaded/jar script.py
    

    在 python 脚本中,将表加载为DataFrame,如下所示:

    from pyspark.sql import DataFrameReader
    
    url = 'postgresql://localhost:5432/dbname'
    properties = {'user': 'username', 'password': 'password'}
    df = DataFrameReader(sqlContext).jdbc(
        url='jdbc:%s' % url, table='tablename', properties=properties
    )
    

    或者:

    df = sqlContext.read.format('jdbc').\
        options(url='jdbc:%s' % url, dbtable='tablename').\
        load()
    

    注意,通过spark-submit提交脚本时,需要定义sqlContext

    【讨论】:

      【解决方案3】:

      在所有节点中都需要复制 postgresql-42.1.4.jar...就我而言,我确实在路径 /opt/spark-2.2.0-bin-hadoop2.7/jars 中复制了

      另外,我在 ~/.bashrc (export SPARK_CLASSPATH="/opt/spark-2.2.0-bin-hadoop2.7/jars" ) 中设置类路径

      在 pyspark 控制台和 jupyter 中工作正常

      【讨论】:

      • 我正在寻找如何在 Amazon EMR 中执行此操作。它曾经对我有用,只是设置 spark.jar=/path/to/driver 但在 EMR 5.2.1(即 Spark 版本 2.0.2)之后我无法让它工作了。
      【解决方案4】:

      你通常需要:

      1. 在您的集群上安装 Postgres 驱动程序,
      2. 使用 --jars 选项从您的客户端提供 Postgres 驱动程序 jar
      3. 或使用 --packages 选项提供 Postgres 驱动程序的 maven 坐标。

      如果您详细说明如何启动 pyspark,我们可能会为您提供更多详细信息。

      一些线索/想法:

      spark-cannot-find-the-postgres-jdbc-driver

      Not able to connect to postgres using jdbc in pyspark shell

      【讨论】:

      • 如果我想在本地运行它怎么办?我需要下载 postgres 驱动程序吗?我应该把它存放在哪里?
      • 是的,你需要它。因为您正在充当 Postgres 客户端,并且您指定要在 "driver = "org.postgresql.Driver"" 选项中使用 Postgres 驱动程序。您可以将其存储在本地计算机中的任何位置(例如 java 安装的 jre\lib\ext),并在 CLASSPATH 中指定存储路径。
      【解决方案5】:

      基于quick start guide 示例的一种方法是this blog post,它显示了如何将--packages org.postgresql:postgresql:9.4.1211 参数添加到spark-submit 命令。

      这会将驱动程序下载到~/.ivy2/jars 目录,在我的情况下为/Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar。将此作为--driver-class-path 选项传递给完整的 spark-submit 命令:

      /usr/local/Cellar/apache-spark/2.0.2/bin/spark-submit\
       --packages org.postgresql:postgresql:9.4.1211\
       --driver-class-path /Users/derekhill/.ivy2/jars/org.postgresql_postgresql-9.4.1211.jar\
       --master local[4] main.py
      

      main.py:

      from pyspark.sql import SparkSession
      
      spark = SparkSession.builder.getOrCreate()
      
      dataframe = spark.read.format('jdbc').options(
              url = "jdbc:postgresql://localhost/my_db?user=derekhill&password=''",
              database='my_db',
              dbtable='my_table'
          ).load()
      
      dataframe.show()
      

      【讨论】:

        【解决方案6】:

        我无法使用计算机上的 jar 连接到 postgresDB。 这段代码解决了我的驱动问题

         from pyspark.sql import SparkSession
         import os
        
         sparkClassPath = os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages org.postgresql:postgresql:42.1.1 pyspark-shell'
        
         spark = SparkSession \
            .builder \
            .config("spark.driver.extraClassPath", sparkClassPath) \
            .getOrCreate()
        
         df = spark.read \
            .format("jdbc") \
            .option("url", "jdbc:postgresql://localhost:5432/yourDBname") \
            .option("driver", "org.postgresql.Driver") \
            .option("dbtable", "yourtablename") \
            .option("user", "postgres") \
            .option("password", "***") \
            .load()
        
        df.show()
        

        【讨论】:

        • 非常感谢!我也在使用配置方法,并且花了很长时间才发现.option("driver", "org.postgresql.Driver") \对于该方法是必需的。
        【解决方案7】:

        要使用 pyspark 和 jupyter notebook notebook:首先用

        打开 pyspark
        pyspark --driver-class-path /spark_drivers/postgresql-42.2.12.jar  --jars /spark_drivers/postgresql-42.2.12.jar
        

        然后在jupyter笔记本中

        import os
        jardrv = "~/spark_drivers/postgresql-42.2.12.jar"
        
        
        from pyspark.sql import SparkSession
        spark = SparkSession.builder.config('spark.driver.extraClassPath', jardrv).getOrCreate()
        url = 'jdbc:postgresql://127.0.0.1/dbname'
        properties = {'user': 'usr', 'password': 'pswd'}
        df = spark.read.jdbc(url=url, table='tablename', properties=properties)
        

        【讨论】:

        • FWIW,如果不将 --driver-class-path 和 --jars 直接指定给 pyspark,我无法获得以下任何解决方案。这是正确答案
        • 我无法让它在 AWS 上的 Zeppelin 笔记本上工作,但是当我 ssh 进入主 EC2 节点并使用 pyspark --driver-class-path /spark_drivers/postgresql-42.2 时它工作了.12.jar --jars /spark_drivers/postgresql-42.2.12.jar。谢谢
        【解决方案8】:

        此异常意味着 jdbc 驱动程序不在驱动程序类路径中。 您可以使用 --jar 参数 spark-submit jdbc jars,也可以使用 spark.driver.extraClassPath 将其添加到驱动程序类路径中。

        【讨论】:

          【解决方案9】:

          我也收到此错误

          java.sql.SQLException: No suitable driver
           at java.sql.DriverManager.getDriver(Unknown Source)
          

          并在SparkSession 中添加一项.config('spark.driver.extraClassPath', './postgresql-42.2.18.jar') - 有效。

          例如:

          from pyspark import SparkContext, SparkConf
          import os
          from pyspark.sql.session import SparkSession
          
          spark = SparkSession \
              .builder \
              .appName('Python Spark Postgresql') \
              .config("spark.jars", "./postgresql-42.2.18.jar") \
              .config('spark.driver.extraClassPath', './postgresql-42.2.18.jar') \
              .getOrCreate()
          
          
          df = spark.read \
              .format("jdbc") \
              .option("url", "jdbc:postgresql://localhost:5432/abc") \
              .option("dbtable", 'tablename') \
              .option("user", "postgres") \
              .option("password", "1") \
              .load()
          
          df.printSchema()
          

          【讨论】:

          • 我尝试使用 .config('spark.driver.extraClassPath', './postgresql-42.2.18.jar') 还是不行。
          【解决方案10】:

          只需用--jars <path/to/your/jdbc.jar>初始化pyspark

          例如:pyspark --jars /path/Downloads/postgresql-42.2.16.jar

          然后按照上面其他答案中的建议创建一个数据框

          例如:

          df2 = spark.read.format("jdbc").option("url", "jdbc:postgresql://localhost:5432/db").option("dbtable", "yourTableHere").option("user", "postgres").option("password", "postgres").option("driver", "org.postgresql.Driver").load()
          

          【讨论】:

            【解决方案11】:
            1. here下载postgresql jar:
            2. 将此添加到 ~Spark/jars/ 文件夹。
            3. 重新启动内核。 它应该可以工作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-03-31
              • 2015-09-25
              • 1970-01-01
              • 2019-09-21
              • 2021-10-24
              • 2016-12-24
              • 2014-04-20
              • 1970-01-01
              相关资源
              最近更新 更多