使用SPARK数据帧的方法“saveAsTable”时权限被拒绝

时间:2016-04-27 11:05:32

标签: hadoop apache-spark kerberos spark-dataframe

我正在使用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:Permission denied:user = XXXXXXXX,access = WRITE,inode =“/ user / hive / warehouse”:hive:hive:drwxrwx - x:user:hive:rwx,组:: ---,组:配置单元: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 forbiden),而sqlContext.sql使用正确的用户“hive”来执行此操作。

我是对的?这是一个错误?它是否适用于较新的火花版本?

谢谢大家。

1 个答案:

答案 0 :(得分:0)

SaveAsTable创建物理表,而registerTempTable在内存中创建(临时)表。 你是对的,用户需要适当的权限来创建物理表。