Apache spark net.snowflake.client.jdbc.SnowflakeSQLException:SQL访问控制错误:权限不足,无法在架构';公共';

Apache spark net.snowflake.client.jdbc.SnowflakeSQLException:SQL访问控制错误:权限不足,无法在架构';公共';,apache-spark,pyspark,snowflake-cloud-data-platform,databricks,Apache Spark,Pyspark,Snowflake Cloud Data Platform,Databricks,尝试使用数据帧时出错 这是我在pyspark的databricks笔记本中运行的一段代码,用于从snowflake获取数据 query = "SELECT * FROM TEST_TABLE LIMIT 10" SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake" df = spark.read.format(SNOWFLAKE_SOURCE_NAME).options(**sfOption

尝试使用数据帧时出错

这是我在pyspark的databricks笔记本中运行的一段代码,用于从snowflake获取数据

query = "SELECT * FROM TEST_TABLE LIMIT 10"
  SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"
  df = spark.read.format(SNOWFLAKE_SOURCE_NAME).options(**sfOptions).option("query", query).load()
  print(type(df))
  print(df.count())
  print((df.count(), len(df.columns)))
数据帧和列计数的大小正确

当我这样做的时候

df.show()
我正在犯错误

  Py4JJavaError: An error occurred while calling o1263.showString.
    : net.snowflake.client.jdbc.SnowflakeSQLException: SQL access control error:
    Insufficient privileges to operate on schema 'PUBLIC'
        at net.snowflake.client.jdbc.SnowflakeUtil.checkErrorAndThrowExceptionSub(SnowflakeUtil.java:152)
        at net.snowflake.client.jdbc.SnowflakeUtil.checkErrorAndThrowException(SnowflakeUtil.java:77)
        at net.snowflake.client.core.StmtUtil.pollForOutput(StmtUtil.java:495)
        at net.snowflake.client.core.StmtUtil.execute(StmtUtil.java:372)
        at net.snowflake.client.core.SFStatement.executeHelper(SFStatement.java:575)
        at net.snowflake.client.core.SFStatement.executeQueryInternal(SFStatement.java:265)
        at net.snowflake.client.core.SFStatement.executeQuery(SFStatement.java:203)
        at net.snowflake.client.core.SFStatement.execute(SFStatement.java:874)
        at net.snowflake.client.jdbc.SnowflakeStatementV1.executeQueryInternal(SnowflakeStatementV1.java:259)
        at net.snowflake.client.jdbc.SnowflakePreparedStatementV1.executeQuery(SnowflakePreparedStatementV1.java:181)
        at net.snowflake.spark.snowflake.JDBCWrapper$$anonfun$executePreparedQueryInterruptibly$1.apply(SnowflakeJDBCWrapper.scala:317)
        at net.snowflake.spark.snowflake.JDBCWrapper$$anonfun$executePreparedQueryInterruptibly$1.apply(SnowflakeJDBCWrapper.scala:315)
        at net.snowflake.spark.snowflake.JDBCWrapper$$anonfun$1.apply(SnowflakeJDBCWrapper.scala:355)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24)
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
提前谢谢。请帮帮我

编辑:问题是因为我在snowflake through spark中运行查询时未被授权创建临时阶段

当我更改snowflake客户端选项时,问题已得到解决,如下所示:

sfOptions = {
        "sfURL": "xxx.snowflakecomputing.com",
        "sfUser": "xxxx",
        "sfDatabase": "TEMP", <- changed this to TEMP from PUBLIC
        "sfSchema": "PUBLIC",
        "sfWarehouse": "xxx",
        "sfRole": "xxxx",
        "pem_private_key": private_key
    }
s选项={
“sfURL”:“xxx.snowflakecomputing.com”,
“sfUser”:“xxxx”,

“sfDatabase”:“TEMP”,执行以下语句以授予访问权限可能对您有所帮助。原因可能是您向表对象授予了select权限,但未授予数据库和/或架构级别的使用权限

GRANT USAGE ON DATABASE [database] TO ROLE [role];
GRANT USAGE ON SCHEMA [database].PUBLIC TO ROLE [role];
GRANT SELECT ON TABLE [database].PUBLIC.[table] TO ROLE [role];

文档:

正如我提到的,我能够在Snowflake dashboard中运行查询。您没有提到或至少我找不到上述信息。如果是这样,您可以看看您是否100%在两种情况下使用相同的角色。