pyspark Java SQL驱动程序管理器在单元目录中不工作

8yoxcaq7  于 5个月前  发布在  Spark
关注(0)|答案(1)|浏览(70)

这在正常数据块工作区中有效,但在Unity Catalog中无效

driver_manager = spark._sc._gateway.jvm.java.sql.DriverManager
con = driver_manager.getConnection(connection_string)

statement = con.prepareCall(query)
statement.execute()

statement.close()
con.close()

字符串
以下代码抛出错误:py4j.security.Py4JSecurityException: Method public static java.sql.Connection java.sql.DriverManager.getConnection(java.lang.String) throws java.sql.SQLException is not whitelisted on class class java.sql.DriverManager
我尝试为getConnection方法传递单独的参数,但听起来这个方法在Unity Catalog sqlsUrl = f"jdbc:sqlserver://{host}:{port};database={dbname}"中已经改变了

username = 'test'
password = 'test'
con = jvm.java.sql.DriverManager.getConnection(sqlsUrl, username,password)

bfnvny8b

bfnvny8b1#

启用了Unity Catalog且访问模式设置为“共享”的群集有许多限制,可将作业与运行在同一(共享)群集上的不同用户隔离。
正如他们所说:“这样用户就不能通过集群访问非特权数据。"
看到

  • 访问模式限制
  • Allowlist--我不建议对spark jar这样做,因为这会破坏这些限制的目的,就像给机器上的每个用户授予root权限一样。
  • This answer有更多的信息/链接。

解决方案是简单地使用访问模式设置为“单用户”的集群。无论如何,您的作业都将以某个用户的身份运行,因此通常您没有理由在生产中使用“共享”集群。
附言:在pyspark中使用spark._sc._gateway.jvm.java.sql.DriverManager创建连接并执行一些查询是一件非常奇怪的事情。你可能选择了错误的方法来做你需要做的事情。

相关问题