如何使用JDBC源在(Py)Spark中写入和读取数据?

时间:2015-06-22 15:30:16

标签: python scala apache-spark apache-spark-sql pyspark

这个问题的目标是记录:

  • 使用PySpark中的JDBC连接读取和写入数据所需的步骤

  • JDBC源和已知解决方案的可能问题

只需稍加更改,这些方法就可以与其他支持的语言一起使用,包括Scala和R.

3 个答案:

答案 0 :(得分:88)

编写数据

  1. 提交应用程序或启动shell时包含适用的JDBC驱动程序。您可以使用例如--packages

    bin/pyspark --packages group:name:version  
    

    或合并driver-class-pathjars

    bin/pyspark --driver-class-path $PATH_TO_DRIVER_JAR --jars $PATH_TO_DRIVER_JAR
    

    也可以在启动JVM实例之前使用PYSPARK_SUBMIT_ARGS环境变量设置这些属性,或使用conf/spark-defaults.conf设置spark.jars.packagesspark.jars / spark.driver.extraClassPath

  2. 选择所需的模式。 Spark JDBC writer支持以下模式:

      
        
    • append:将此内容:class:DataFrame附加到现有数据。
    •   
    • overwrite:覆盖现有数据。
    •   
    • ignore:如果数据已存在,请静默忽略此操作。
    •   
    • error(默认情况):如果数据已存在,则抛出异常。
    •   

    Upserts或其他细粒度修改are not supported

    mode = ...
    
  3. 准备JDBC URI,例如:

    # You can encode credentials in URI or pass
    # separately using properties argument
    # of jdbc method or options
    
    url = "jdbc:postgresql://localhost/foobar"
    
  4. (可选)创建JDBC参数字典。

    properties = {
        "user": "foo",
        "password": "bar"
    }
    

    properties / options也可用于设置supported JDBC connection properties

  5. 使用DataFrame.write.jdbc

    df.write.jdbc(url=url, table="baz", mode=mode, properties=properties)
    

    保存数据(详见pyspark.sql.DataFrameWriter)。

  6. 已知问题

    • 使用--packagesjava.sql.SQLException: No suitable driver found for jdbc: ...

      包含驱动程序时,找不到合适的驱动程序

      假设没有驱动程序版本不匹配来解决此问题,您可以将driver类添加到properties。例如:

      properties = {
          ...
          "driver": "org.postgresql.Driver"
      }
      
    • 使用df.write.format("jdbc").options(...).save()可能会导致:

        

      java.lang.RuntimeException:org.apache.spark.sql.execution.datasources.jdbc.DefaultSource不允许将create table作为select。

      解决方案未知。

    • 在Pyspark 1.3中
    • ,您可以尝试直接调用Java方法:

      df._jdf.insertIntoJDBC(url, "baz", True)
      

    读取数据

    1. 按照写入数据
    2. 中的步骤1-4进行操作
    3. 使用sqlContext.read.jdbc

      sqlContext.read.jdbc(url=url, table="baz", properties=properties)
      

      sqlContext.read.format("jdbc")

      (sqlContext.read.format("jdbc")
          .options(url=url, dbtable="baz", **properties)
          .load())
      
    4. 已知问题和陷阱

      在哪里可以找到合适的驱动程序:

      其他选项

      根据数据库的不同,可能存在专门的来源,在某些情况下首选:

答案 1 :(得分:-2)

下载 mysql-connector-java 驱动程序并保存在spark jar文件夹中,观察这里将数据写入" acotr1"的bellow python代码,我们必须创建acotr1表结构mysql数据库

    spark = SparkSession.builder.appName("prasadad").master('local').config('spark.driver.extraClassPath','D:\spark-2.1.0-bin-hadoop2.7\jars\mysql-connector-java-5.1.41-bin.jar').getOrCreate()

    sc = spark.sparkContext

    from pyspark.sql import SQLContext

    sqlContext = SQLContext(sc)

    df = sqlContext.read.format("jdbc").options(url="jdbc:mysql://localhost:3306/sakila",driver="com.mysql.jdbc.Driver",dbtable="actor",user="root",password="Ramyam01").load()

    mysql_url="jdbc:mysql://localhost:3306/sakila?user=root&password=Ramyam01"

    df.write.jdbc(mysql_url,table="actor1",mode="append")

答案 2 :(得分:-4)

请参阅此链接以下载postgres的jdbc,并按照下载jar文件的步骤进行操作

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/exercises/spark-exercise-dataframe-jdbc-postgresql.html jar文件将在这样的路径下载。 “/home/anand/.ivy2/jars/org.postgresql_postgresql-42.1.1.jar”

如果你的火花版本是2

from pyspark.sql import SparkSession

spark = SparkSession.builder
        .appName("sparkanalysis")
        .config("spark.driver.extraClassPath",
         "/home/anand/.ivy2/jars/org.postgresql_postgresql42.1.1.jar")
        .getOrCreate()

//for localhost database//

pgDF = spark.read \
.format("jdbc") \
.option("url", "jdbc:postgresql:postgres") \
.option("dbtable", "public.user_emp_tab") \
.option("user", "postgres") \
.option("password", "Jonsnow@100") \
.load()


print(pgDF)

pgDF.filter(pgDF["user_id"]>5).show()

将文件保存为python并运行“python individfilename.py”