Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用JDBC源代码在(Py)Spark中写入和读取数据?_Python_Scala_Apache Spark_Apache Spark Sql_Pyspark - Fatal编程技术网

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

Python 如何使用JDBC源代码在(Py)Spark中写入和读取数据?,python,scala,apache-spark,apache-spark-sql,pyspark,Python,Scala,Apache Spark,Apache Spark Sql,Pyspark,本问题的目的是记录: 在PySpark中使用JDBC连接读写数据所需的步骤 JDBC源代码和已知解决方案可能存在的问题 只要稍作改动,这些方法就可以与其他受支持的语言(包括Scala和R)一起使用。编写数据 提交应用程序或启动shell时,请包含适用的JDBC驱动程序。例如,您可以使用--packages: bin/pyspark --packages group:name:version 或者组合驱动程序类路径和jars bin/pyspark --driver-class-path

本问题的目的是记录:

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

  • JDBC源代码和已知解决方案可能存在的问题

只要稍作改动,这些方法就可以与其他受支持的语言(包括Scala和R)一起使用。

编写数据
  • 提交应用程序或启动shell时,请包含适用的JDBC驱动程序。例如,您可以使用
    --packages

    bin/pyspark --packages group:name:version  
    
    或者组合
    驱动程序类路径
    jars

    bin/pyspark --driver-class-path $PATH_TO_DRIVER_JAR --jars $PATH_TO_DRIVER_JAR
    
    也可以在JVM实例启动之前使用
    PYSPARK\u SUBMIT\u ARGS
    环境变量设置这些属性,或者使用
    conf/spark defaults.conf
    设置
    spark.jars.packages
    spark.jars
    /
    spark.driver.extraClassPath

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

    • append
      :将此:类:
      DataFrame
      的内容追加到现有数据
    • 覆盖
      :覆盖现有数据
    • 忽略
      :如果数据已经存在,则自动忽略此操作
    • 错误
      (默认情况):如果数据已经存在,则引发异常
    升级或其他细粒度修改

  • 准备JDBC URI,例如:

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

    properties = {
        "user": "foo",
        "password": "bar"
    }
    
    属性
    /
    选项
    也可用于设置

  • 使用
    DataFrame.write.jdbc

    df.write.jdbc(url=url, table="baz", mode=mode, properties=properties)
    
    保存数据(有关详细信息,请参阅)

  • 已知问题

    • 使用
      --包
      包含驱动程序时,找不到合适的驱动程序(
      java.sql.SQLException:找不到适合jdbc的驱动程序:…

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

      # You can encode credentials in URI or pass
      # separately using properties argument
      # of jdbc method or options
      
      url = "jdbc:postgresql://localhost/foobar"
      
      properties = {
          ...
          "driver": "org.postgresql.Driver"
      }
      
    • 使用
      df.write.format(“jdbc”).options(…).save()
      可能会导致:

      java.lang.RuntimeException:org.apache.spark.sql.execution.datasources.jdbc.DefaultSource不允许按选择创建表

      解决方案未知

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

      df._jdf.insertIntoJDBC(url, "baz", True)
      
    读取数据
  • 从写入数据开始执行步骤1-4
  • 使用
    sqlContext.read.jdbc

    sqlContext.read.jdbc(url=url, table="baz", properties=properties)
    
    (sqlContext.read.format("jdbc")
        .options(url=url, dbtable="baz", **properties)
        .load())
    
    sqlContext.read.format(“jdbc”)

  • 已知问题和陷阱

    • 找不到合适的驱动程序-请参阅:写入数据
    • Spark SQL支持JDBC源的谓词下推,尽管并非所有谓词都可以下推。它也不委托限制或聚合。可能的解决方法是用有效的子查询替换
      dbtable
      /
      table
      参数。例如,见:

    • 默认情况下,JDBC数据源使用单个执行器线程按顺序加载数据。要确保分布式数据加载,您可以:

      • 提供分区
        (必须是
        整型类型
        )、
        下限
        上限
        数值分区
      • 提供互斥谓词列表,每个所需分区一个
      见:

      • ,
      • ,
    • 在分布式模式下(使用分区列或谓词),每个执行器在其自己的事务中操作。如果同时修改源数据库,则无法保证最终视图的一致性

    在哪里可以找到合适的司机:
    • (要获取
      --软件包所需的坐标,请选择所需版本,并从表格
      编译组:名称:版本
      中的渐变选项卡复制数据,替换相应字段)或:

    其他选择 根据数据库的不同,可能存在专门的源,并且在某些情况下首选:

    • 青梅-
    • 阿帕奇凤凰-
    • Microsoft SQL Server-
    • Amazon Redshift-(当前版本仅在专有的Databricks运行时中可用)

    下载mysql连接器java驱动程序并保存在spark jar文件夹中,观察下面的python代码将数据写入“acotr1”,我们必须在mysql数据库中创建acotr1表结构

        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="****").load()
    
        mysql_url="jdbc:mysql://localhost:3306/sakila?user=root&password=****"
    
        df.write.jdbc(mysql_url,table="actor1",mode="append")
    

    参考此链接下载postgres的jdbc,并按照步骤下载jar文件

    jar文件将按如下路径下载。 “/home/anand/.ivy2/jars/org.postgresql\u postgresql-42.1.1.jar”

    如果你的spark版本是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 reservivefilename.py”

    这非常容易使用,难以置信。mode=“overwrite”使用以下命令:spark_submit--driver class path/xx/yy/postgresql-xx.jar my-script.py