Python 使用雪花火花连接器获得空指针异常

Python 使用雪花火花连接器获得空指针异常,python,apache-spark,pyspark,snowflake-cloud-data-platform,Python,Apache Spark,Pyspark,Snowflake Cloud Data Platform,我有一个3节点的spark群集。并尝试使用snowflake spark连接器和jdbc驱动程序访问snowflake jdbc:snowflake-jdbc-3.12.4.jar 火花连接器:spark-snowflake_2.11-2.7.0-spark_2.4.jar 这是我的密码: sfOptions = { "sfURL" : "{}.snowflakecomputing.com".format(ACCOUNT_NAME), "sfUser" : "{}@fmr.com".fo

我有一个3节点的spark群集。并尝试使用snowflake spark连接器和jdbc驱动程序访问snowflake

jdbc:snowflake-jdbc-3.12.4.jar 火花连接器:spark-snowflake_2.11-2.7.0-spark_2.4.jar

这是我的密码:

sfOptions = {
  "sfURL" : "{}.snowflakecomputing.com".format(ACCOUNT_NAME),
  "sfUser" : "{}@fmr.com".format(USER_ID),
  "sfAccount" : "{}".format(ACCOUNT_ID),
  "sfRole" : "{}".format(DEFAULT_ROLE),
  "sfAuthenticator" : "oauth",
  "sfToken" : "{}".format(oauth_token),
  "sfDatabase" : "{}".format(DATABASE),
  "sfSchema" : "{}".format(SCHEMA),
  "sfWarehouse" : "{}".format(WAREHOUSE)
}

SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"
....
conf = (SparkConf()
    .setMaster("spark://<master-url>")
    .setAppName("Spark-Snowflake-Connector")
    )


spark = (SparkSession.builder.config(conf=conf)
    .enableHiveSupport()
    .getOrCreate())
spark._jvm.net.snowflake.spark.snowflake.SnowflakeConnectorUtils.enablePushdownSession(spark._jvm.org.apache.spark.sql.SparkSession.builder().getOrCreate())


sdf = spark.read.format(SNOWFLAKE_SOURCE_NAME) \
   .options(**sfOptions) \
   .option("query",  "select * from TIME_AGE") \
   .load()
sdf.show()
s选项={
“sfURL”:“{}.snowflakecomputing.com”。格式(帐户名),
“sfUser”:“{}@fmr.com”。格式(用户ID),
“sfAccount”:“{}”.format(ACCOUNT_ID),
“sfRole”:“{}”.format(默认的_角色),
“sfAuthenticator”:“oauth”,
“sfToken”:“{}”.format(oauth_令牌),
“sfDatabase”:“{}”。格式(数据库),
“sfSchema”:“{}”。格式(SCHEMA),
“sfWarehouse”:“{}”。格式(仓库)
}
雪花\u SOURCE\u NAME=“net.SNOWFLAKE.spark.SNOWFLAKE”
....
conf=(SparkConf()
.setMaster(“火花:/”)
.setAppName(“火花雪花连接器”)
)
spark=(SparkSession.builder.config(conf=conf)
.enableHiveSupport()
.getOrCreate())
spark._jvm.net.snowflake.spark.snowflake.snowflake connectorutils.enablePushdownSession(spark._jvm.org.apache.spark.sql.sparksSession.builder().getOrCreate())
sdf=spark.read.format(雪花\源\名称)\
.选项(**s选项)\
.选项(“查询”,“选择*从时间开始”)\
.load()
sdf.show()
我对sdf.show()的调用失败,出现以下异常。有什么建议吗

20/04/26 09:54:55信息调度程序:作业0失败:在处显示字符串 NativeMethodAccessorImpl.java:0,进行了5.494100的回溯(大多数 最近一次调用:文件“/fedata/a393831/snowflake/spark driver.py”, 第114行,在 sdf.show()文件“/apps/shared/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py”, 第378行,在show文件中 “/apps/shared/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”, 第1257行,在调用文件中 “/apps/shared/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,第行 63,在装饰文件中 “/apps/shared/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py”, 第328行,在get_return_值py4j.protocol.Py4JJavaError中:一个错误 调用o68.showString时发生: org.apache.spark.sparkeexception:由于阶段失败,作业中止: 阶段0.0中的任务0失败4次,最近一次失败:丢失任务0.3 在第0.0阶段(TID 3,10.240.62.46,执行者0): 位于的java.lang.NullPointerException net.snowflake.client.core.sfarrowsresultset.getObject(sfarrowsresultset.java:570) 在 net.snowflake.client.jdbc.SnowflakeResultSetV1.getObject(SnowflakeResultSetV1.java:336) 在 net.snowflake.spark.snowflake.io.ResultIterator$$anonfun$2.apply(snowflakeresultsetrad.scala:115) 在 net.snowflake.spark.snowflake.io.ResultIterator$$anonfun$2.apply(snowflakeresultsetrad.scala:114) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 在 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:234) 位于scala.collection.immutable.Range.foreach(Range.scala:160) scala.collection.TraversableLike$class.map(TraversableLike.scala:234) 位于scala.collection.AbstractTraversable.map(Traversable.scala:104) 在 net.snowflake.spark.snowflake.io.ResultIterator.next(SnowflakeResultSetRDD.scala:114) 位于scala.collection.Iterator$$anon$11。下一步(Iterator.scala:410)位于 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:256) 在 org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:247) 在 org.apache.spark.rdd.rdd$$anonfun$mapPartitionsInternal$1$$anonfun$apply$24.apply(rdd.scala:836) 在 org.apache.spark.rdd.rdd$$anonfun$mapPartitionsInternal$1$$anonfun$apply$24.apply(rdd.scala:836) 在 org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52) 在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324) 位于org.apache.spark.rdd.rdd.iterator(rdd.scala:288) org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)位于 org.apache.spark.scheduler.Task.run(Task.scala:121)位于 org.apache.spark.executor.executor$TaskRunner$$anonfun$10.apply(executor.scala:408) 位于org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)


对于相同的连接器和驱动程序配置,我有相同的问题。我的查询只是计算SF样本表上的行数-snowflake\u sample\u data.tpch\u sf1.lineitem

"sfDatabase" -> "snowflake_sample_data",
"sfSchema" -> "tpch_sf1",
"query" -> "select count(*) from lineitem"

所以我刚刚用版本3.12.0试用了jdbc驱动程序,它可以正常工作。因此,新版本的驱动程序似乎出现了倒退。

在使用Spark Connector Spark-Snowflake_2.11-2.7.0-Spark_2.4.jar时,Snowflake JDBC 3.12.4 jar版本似乎存在问题。您可以试用3.12.3版本的Snowflake JDBC驱动程序吗。这与上面的火花连接器版本配合得很好。

时间年龄有多大?你能试试这个表的一个子集吗?它只有大约400行和5列。你在Spark应用程序中使用的是Thread吗?我在python连接器中使用了相同的驱动程序snowflake-jdbc-3.12.4.jar,效果很好。我使用jdbc 3.12.8解决了相同的错误,这是本文撰写时最新的一个。是的,我们注意到了这一点,并在以后的版本中修复了它。太好了,它对你有用。