使用spark dataframes的方法“saveastable”时权限被拒绝

11dmarpk  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(542)

我´我用spark 1.3和我´我试图从一个rdd生成一个表。这是伪代码:

val sc = new org.apache.spark.SparkContext(conf)
val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)
import sqlContext.implicits._

val rdd1=sc.textFile(path_1).map(........) // RDD[(string,Double)]
val rdd2=sc.textFile(path_2).map(........) // RDD[(string,Double)]
val rdd_join=rdd1.fullOuterJoin(rdd2)      // RDD[String,(Option(Double),Option(Double))) 
val rdd_get = rdd_join.map(....}           // RDD[(String,Double,Double)]
rdd_get.toDF().saveAsTable("database.tablename")

运行此代码时,我´获取权限错误:
org.apache.hadoop.security.accesscontrolexception:权限被拒绝:user=xx,access=write,inode=“/user/hive/warehouse”:hive:hive:drwxrwx--x:user:hive:rwx,组::--,group:hive:rwx
如果我将表创建为:

rdd_get.toDF().registerTempTable("rdd_get_temp")
  sqlContext.sql("CREATE TABLE database.tablename AS SELECT * FROM rdd_get_temp")

然后它工作并创建表。似乎saveastable()正在尝试使用我的用户写入“/user/hive/warehouse”(kerberization禁止这样做),而sqlcontext.sql正确地使用了用户“hive”来完成。
我说的对吗??这是虫子吗??它在较新的spark版本中工作吗?
谢谢大家。

iyr7buue

iyr7buue1#

saveastable创建物理表,registertemptable在内存中创建(临时)表。是的,用户需要适当的权限才能创建物理表。

相关问题