当前位置: 首页 > 知识库问答 >
问题:

删除配置单元分区外部表,但保留分区

东郭展
2023-03-14

当使用外部配置单元表时,是否有一种方法可以删除目录中的数据,但通过查询保留分区。请注意,我不想删除表并重新创建它。我只想清空底层文件夹并重新启动一个进程。我的表很大,按年、月、日期和小时划分分区,手动重新创建分区需要大量时间。

谢谢

共有1个答案

宰坚
2023-03-14

截断表...删除所有数据。
截断表分区(...)删除特定分区的数据。

保留目录结构。

应首先将外部工作台转换成带槽的。例如

alter table t set tblproperties('EXTERNAL'='FALSE');
alter table t set tblproperties('EXTERNAL'='TRUE');
create table t (i int) partitioned by (x char(1));
set hive.exec.dynamic.partition.mode=nonstrict;
insert into t partition (x) values (1,'A'),(2,'B'),(3,'C');
alter table t set tblproperties('EXTERNAL'='TRUE');
select * from t;
+-----+-----+
| t.i | t.x |
+-----+-----+
|   1 | A   |
|   2 | B   |
|   3 | C   |
+-----+-----+
dfs -ls -R /user/hive/warehouse/t;
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=A
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=A/000000_0
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=B
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=B/000000_0
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=C
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=C/000000_0
truncate table t partition (x='B');
alter table t set tblproperties('EXTERNAL'='FALSE');
truncate table t partition (x='B');
select * from t;
+-----+-----+
| t.i | t.x |
+-----+-----+
|   1 | A   |
|   3 | C   |
+-----+-----+
dfs -ls -R /user/hive/warehouse/t;
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=A
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=A/000000_0
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:42 /user/hive/warehouse/t/x=B
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:40 /user/hive/warehouse/t/x=C
-rwxrwxrwx   1 cloudera supergroup          2 2017-03-28 11:40 /user/hive/warehouse/t/x=C/000000_0
truncate table t;
+-----+-----+
| t.i | t.x |
+-----+-----+
dfs -ls -R /user/hive/warehouse/t;
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:43 /user/hive/warehouse/t/x=A
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:43 /user/hive/warehouse/t/x=B
drwxrwxrwx   - cloudera supergroup          0 2017-03-28 11:43 /user/hive/warehouse/t/x=C
alter table t set tblproperties('EXTERNAL'='TRUE');
 类似资料:
  • 我有一个配置单元外部表,有3个分区列(a,B,C),现在我想从分区中删除B和C列。这样做可能吗?我已经尝试使用Alter table tab_name drop column col_name;---但它会抛出一个错误,说明无法删除分区列。

  • 插入覆盖表myTable分区(字段)从myTable中选择*,其中机器='xxxxx' 但是SELECT中的数据不会替换MyTable中的数据。

  • 我有一个配置单元表,其中一个date列上存在分区,但date列以YYYYMMDD格式存储为INT。该表还可以包含未来日期分区的数据。 现在,作为过程的一部分,我希望删除那些在处理日(位于处理日)上运行的分区。 当我编写drop分区时,比如,那么它工作正常。 考虑到我的输入将是唯一的日期格式YYYY-MM-DD和我已经删除所有分区已给出输入日期-1;如何使上述陈述奏效?

  • 我有一个外部配置单元表,其中有诸如year=2017,year=2018之类的分区,在它们内部,我还有year=2017和year=2018的每个月的分区。 如果是内部表,会发生什么情况?

  • 我有一个复杂的/嵌套的配置单元外部表,它是在HDFS顶部创建的(文件是avro格式的)。当我运行配置单元查询时,它会显示所有记录和分区。 然而,当我在Spark中使用相同的表时: 请注意,当我查看数据时,分区列不是底层保存数据的一部分,但当我通过hive查询表时,我可以看到它。当我尝试使用PySpark加载avro文件时,我也可以看到分区列: 所以我想知道那是什么样子?

  • 1-创建了源表 2-将数据从本地加载到源表 3-创建了另一个带有分区的表-partition_table 我不确定如何在外部表中进行分区。有人能帮我一步一步地描述一下吗?。