我打算截断具有一个分区的配置单元外部表。因此,我使用以下命令截断表:
hive> truncate table abc;
但是,它给我一个错误说明:无法截断非托管表 abc。
任何人都可以就同样的问题向我提出建议...
我打算截断具有一个分区的配置单元外部表。因此,我使用以下命令截断表:
hive> truncate table abc;
但是,它给我一个错误说明:无法截断非托管表 abc。
任何人都可以就同样的问题向我提出建议...
先做你的桌子MANAGED
:
ALTER TABLE abc SET TBLPROPERTIES('EXTERNAL'='FALSE');
然后截断:
truncate table abc;
最后,您可以再次将其设为外部:
ALTER TABLE abc SET TBLPROPERTIES('EXTERNAL'='TRUE');
对此有一个更好的解决方案,基本上是一个班轮。
insert overwrite table table_xyz select * from table_xyz where 1=2;
此代码将删除所有文件并在外部文件夹位置创建一个具有绝对零记录的空白文件。
默认情况下,TRUNCATE TABLE 仅在托管表上受支持。尝试截断外部表会导致以下错误:
错误:org.apache.spark.sql.AnalysisException:不允许操作:外部表上的 TRUNCATE TABLE
需要采取的行动
更改应用程序。不要尝试在外部表上运行 TRUNCATE TABLE。
或者,更改应用程序以更改表属性以将 external.table.purge 设置为 true 以允许截断外部表:
ALTER TABLE mytable SET TBLPROPERTIES ('external.table.purge'='true');