Apache spark JDBC在PySpark中不工作

Apache spark JDBC在PySpark中不工作,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,我使用的是CDH 5.4.0虚拟机附带的spark 1.3.0 我正在尝试运行代码片段,以便通过JDBC在pyspark上运行查询 我无法使用以下任何一项进行连接: 1) pyspark --driver-class-path /usr/share/java/mysql-connector-java.jar 2) os.environ['SPARK_CLASSPATH'] = "usr/share/java/mysql-connector-java.jar" 在这两种情况下,当我运行此语句时

我使用的是CDH 5.4.0虚拟机附带的
spark 1.3.0

我正在尝试运行代码片段,以便通过
JDBC
pyspark
上运行查询 我无法使用以下任何一项进行连接:

1) pyspark --driver-class-path /usr/share/java/mysql-connector-java.jar

2) os.environ['SPARK_CLASSPATH'] = "usr/share/java/mysql-connector-java.jar"
在这两种情况下,当我运行此语句时:

dept1 = sqlContext.load(source="jdbc", url="jdbc_url", dbtable="departments")
我得到一个错误:

Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "/usr/lib/spark/python/pyspark/sql/context.py", line 482, in load
     df = self._ssql_ctx.load(source, joptions)
   File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py",
   line 538, in __call__
   File "/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py",
   line 300, in get_return_value
 py4j.protocol.Py4JJavaError: An error occurred while calling o25.load.
 : java.lang.StringIndexOutOfBoundsException: String index out of range: 10
    at java.lang.String.substring(String.java:1907)
    at org.apache.spark.sql.jdbc.DriverQuirks$.get(DriverQuirks.scala:52)
    at org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:93)
    at org.apache.spark.sql.jdbc.JDBCRelation.<init>(JDBCRelation.scala:125)
    at org.apache.spark.sql.jdbc.DefaultSource.createRelation(JDBCRelation.scala:114)
    at org.apache.spark.sql.sources.ResolvedDataSource$.apply(ddl.scala:290)
    at org.apache.spark.sql.SQLContext.load(SQLContext.scala:679)
    at org.apache.spark.sql.SQLContext.load(SQLContext.scala:667)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
    at py4j.Gateway.invoke(Gateway.java:259)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:207)
    at java.lang.Thread.run(Thread.java:745)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/usr/lib/spark/python/pyspark/sql/context.py”,第482行,装入
df=自加载(源、作业)
文件“/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/java_gateway.py”,
第538行,来电__
文件“/usr/lib/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py”,
第300行,在get_return_值中
py4j.protocol.Py4JJavaError:调用o25.load时出错。
:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:10
位于java.lang.String.substring(String.java:1907)
位于org.apache.spark.sql.jdbc.DriverQuirks$.get(DriverQuirks.scala:52)
位于org.apache.spark.sql.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:93)
位于org.apache.spark.sql.jdbc.jdbcreation.(jdbcreation.scala:125)
位于org.apache.spark.sql.jdbc.DefaultSource.createRelation(jdbcreation.scala:114)
位于org.apache.spark.sql.sources.resolvedatasource$.apply(ddl.scala:290)
位于org.apache.spark.sql.SQLContext.load(SQLContext.scala:679)
位于org.apache.spark.sql.SQLContext.load(SQLContext.scala:667)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)中
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:606)
位于py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231)
位于py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)
在py4j.Gateway.invoke处(Gateway.java:259)
位于py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:133)
在py4j.commands.CallCommand.execute(CallCommand.java:79)
在py4j.GatewayConnection.run处(GatewayConnection.java:207)
运行(Thread.java:745)
尝试添加--jars/usr/share/java/mysql-connector-java.jar开关。 为什么要使用驱动程序类路径,只需将jar设置为驱动程序,而不是工人--jars也会将其发送给他们。

尝试添加--jars/usr/share/java/mysql-connector-java.jar开关。
为什么要使用驱动程序类路径,只需将jar设置为驱动程序,而不是工人--jars也会将其发送给他们。

该错误是由于缺少依赖项造成的。你有没有想过改用它

要通过红移spark进行连接,请验证spark主目录中是否有以下jar文件:

  • spark-redshift_2.10-3.0.0-preview1.jar
  • RedshiftJDBC41-1.1.10.1010.jar
  • hadoop-aws-2.7.1.jar
  • aws-java-sdk-1.7.4.jar
  • (aws-java-sdk-s3-1.11.60.jar)(更新的版本,但并非所有功能都可以使用)
  • 将这些jar文件放入$SPARK\u HOME/jars/中,然后启动SPARK

    pyspark --jars $SPARK_HOME/jars/spark-redshift_2.10-3.0.0-preview1.jar,$SPARK_HOME/jars/RedshiftJDBC41-1.1.10.1010.jar,$SPARK_HOME/jars/hadoop-aws-2.7.1.jar,$SPARK_HOME/jars/aws-java-sdk-s3-1.11.60.jar,$SPARK_HOME/jars/aws-java-sdk-1.7.4.jar
    
    (SPARK_HOME应该是=“/usr/local/ceral/apache SPARK/$SPARK_VERSION/libexec”)

    这将运行带有所有必要依赖项的Spark。请注意,如果使用awsAccessKeys,还需要指定身份验证类型“forward\u spark\u s3\u credentials”=True

    from pyspark.sql import SQLContext
    from pyspark import SparkContext
    
    sc = SparkContext(appName="Connect Spark with Redshift")
    sql_context = SQLContext(sc)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", <ACCESSID>)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", <ACCESSKEY>)
    
    df = sql_context.read \
         .format("com.databricks.spark.redshift") \
         .option("url", "jdbc:redshift://example.coyf2i236wts.eu-central-    1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd") \
         .option("dbtable", "table_name") \
         .option('forward_spark_s3_credentials',True) \
         .option("tempdir", "s3n://bucket") \
         .load()
    
    从pyspark.sql导入SQLContext
    从pyspark导入SparkContext
    sc=SparkContext(appName=“将Spark与红移连接起来”)
    sql_context=SQLContext(sc)
    sc.jsc.hadoopConfiguration().set(“fs.s3n.awsAccessKeyId”,)
    sc.jsc.hadoopConfiguration().set(“fs.s3n.awsSecretAccessKey”,)
    df=sql\u context.read\
    .format(“com.databricks.spark.redshift”)\
    .选项(“url”,“jdbc:redshift://example.coyf2i236wts.eu-central-    1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd)\
    .选项(“数据库表”、“表名称”)\
    .选项(“转发\u火花\u s3\u凭证”,真)\
    .option(“tempdir”、“s3n://bucket”)\
    .load()
    
    之后常见的错误有:

    • 红移连接错误:“SSL关闭”
      • 解决方案: 选项(“url”,“jdbc:redshift://example.coyf2i236wts.eu-central- 1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory”)
    • S3错误:卸载数据时,例如在df.show()之后,您会收到消息:“您试图访问的存储桶必须使用指定的端点寻址。请将所有未来的请求发送到此端点。”
      • 解决方案:bucket和cluster必须在同一区域内运行

    该错误是由于缺少依赖项造成的。你有没有想过改用它

    要通过红移spark进行连接,请验证spark主目录中是否有以下jar文件:

  • spark-redshift_2.10-3.0.0-preview1.jar
  • RedshiftJDBC41-1.1.10.1010.jar
  • hadoop-aws-2.7.1.jar
  • aws-java-sdk-1.7.4.jar
  • (aws-java-sdk-s3-1.11.60.jar)(更新的版本,但并非所有功能都可以使用)
  • 将这些jar文件放入$SPARK\u HOME/jars/中,然后启动SPARK

    pyspark --jars $SPARK_HOME/jars/spark-redshift_2.10-3.0.0-preview1.jar,$SPARK_HOME/jars/RedshiftJDBC41-1.1.10.1010.jar,$SPARK_HOME/jars/hadoop-aws-2.7.1.jar,$SPARK_HOME/jars/aws-java-sdk-s3-1.11.60.jar,$SPARK_HOME/jars/aws-java-sdk-1.7.4.jar
    
    (SPARK_HOME应该是=“/usr/local/ceral/apache SPARK/$SPARK_VERSION/libexec”)

    这将运行带有所有必要依赖项的Spark。请注意,如果使用awsAccessKeys,还需要指定身份验证类型“forward\u spark\u s3\u credentials”=True

    from pyspark.sql import SQLContext
    from pyspark import SparkContext
    
    sc = SparkContext(appName="Connect Spark with Redshift")
    sql_context = SQLContext(sc)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", <ACCESSID>)
    sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", <ACCESSKEY>)
    
    df = sql_context.read \
         .format("com.databricks.spark.redshift") \
         .option("url", "jdbc:redshift://example.coyf2i236wts.eu-central-    1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd") \
         .option("dbtable", "table_name") \
         .option('forward_spark_s3_credentials',True) \
         .option("tempdir", "s3n://bucket") \
         .load()
    
    从pyspark.sql导入SQLContext
    从pyspark导入SparkContext
    sc=SparkContext(appName=“将Spark与红移连接起来”)
    sql_context=SQLContext(sc)
    sc.jsc.hadoopConfiguration().set(“fs.s3n.awsAccessKeyId”,)
    sc.jsc.hadoopConfiguration().set(“fs.s3n.awsSecretAccessKey”,)
    df=sql\u context.read\
    .format(“com.databricks.spark.redshift”)\
    .选项(“url”,“jdbc:redshift://example.coyf2i236wts.eu-central-    1.redshift.amazonaws.com:5439/agcdb?user=user&password=pwd)\
    .选项(“数据库表”、“表名称”)\
    .选项(“转发\u火花\u s3\u凭证”,真)\