代码之家  ›  专栏  ›  技术社区  ›  sami

Spark sql Insert覆盖附加数据而不是覆盖

  •  2
  • sami  · 技术社区  · 7 年前
    1. 使用外部表
    2. 进程没有对/home/user/的写入权限。废物
    3. 调用“插入覆盖”将生成以下警告

      2018-08-29 13:52:00警告TrashPolicyDefault:141-无法创建垃圾箱目录:hdfs://nameservice1/user/XXXXX/.Trash/Current/data/table_1/key1=2 组织。阿帕奇。hadoop。安全AccessControlException:权限被拒绝:user=XXXXX,access=EXECUTE,inode=“/user/XXXXX/.Trash/Current/data/table_1/key1=2”:hdfs:hdfs:drwx

    问题:

    1. 我们能不能避免搬家。废物在外部表上使用TBLProperty('auto.purge'='true')不起作用。
    2. “插入覆盖”应该重写分区数据,而不是将新数据附加到分区

    代码示例

    创建表格

    spark.sql("CREATE EXTERNAL TABLE table_1 (id string, name string) PARTITIONED BY (key1 int) stored as parquet  location 'hdfs://nameservice1/data/table_1'")
    spark.sql("insert into table_1 values('a','a1', 1)").collect()
    spark.sql("insert into table_1 values ('b','b2', 2)").collect()
    spark.sql("select * from  table_1").collect()
    

    覆盖分区:

    spark.sql("insert OVERWRITE table  table_1 values ('b','b3', 2)").collect()
    

    导致

    [Row(id=u'a', name=u'a1', key1=1),
     Row(id=u'b', name=u'b2', key1=2),
     Row(id=u'b', name=u'b3', key1=2)] 
    
    0 回复  |  直到 7 年前
        1
  •  1
  •   Prasad Sogalad    6 年前

    添加 分区(列) 在你的插入中。

    val spark = SparkSession.builder.appName("test").config("hive.exec.dynamic.partition", "true").config("hive.exec.dynamic.partition.mode", "nonstrict").enableHiveSupport().getOrCreate
    
        spark.sql("drop table table_1")
    
        spark.sql("CREATE EXTERNAL TABLE table_1 (id string, name string) PARTITIONED BY (key1 int) stored as parquet  location '/directory/your location/'")
    
        spark.sql("insert into table_1 values('a','a1', 1)")
    
        spark.sql("insert into table_1 values ('b','b2', 2)")
    
        spark.sql("select * from  table_1").show()
    
        spark.sql("insert OVERWRITE table table_1 PARTITION(key1) values ('b','b3', 2)")
    
        spark.sql("select * from  table_1").show()
    

    CODE IMAGE