如何通过PySpark查找Hive表是否定义为外部表?

时间:2018-08-07 20:05:18

标签: apache-spark hive pyspark

对于上下文-数据驻留在S3上,写为Hive表。我正在本地计算机上运行一些Jupyter笔记本,这些笔记本应该指向作为Hive表的S3数据,而metdata存储在Spark集群的某些关系数据库中。

当我在本地计算机上运行一些本地脚本/ Jupyter笔记本来创建和加载一些表时,就是说尽管没有将它们创建为外部表,但我还是创建了一些外部表。

当我运行spark.sql("show tables in target_db").show(20, False)时,我什么也看不到。然后,创建不带external选项的表,然后再次运行show命令,输出:

+----------+-------------------+-----------+
|database  |tableName          |isTemporary|
+----------+-------------------+-----------+
|target_db |mytable            |false      |
+----------+-------------------+-----------+

并运行我的脚本,该脚本出错,并说: org.apache.spark.sql.AnalysisException: Operation not allowed: TRUNCATE TABLE on external tables: ``target_db``.``mytable``;

我将表放到了群集本身上,所以我认为这没有问题。 Spark如何认为我的表是外部表?我需要更改表的创建方式吗?

2 个答案:

答案 0 :(得分:0)

  1. 您应该通过创建外部表来访问s3中的数据。假设此表称为T1。
  2. 如果表T1定义使用分区,那么您需要修复表以加载分区。
  3. 您不能截断外部表T1。您应该只阅读它。

答案 1 :(得分:0)

使用CREATE EXTERNAL TABLE ...语句创建的表是外部的。 用CREATE TABLE创建的表不是。

您可以使用SHOW CREATE TABLE table_name检查哪个 或使用DESCRIBE FORMATTED table_name,称为Type的字段可以是MANAGEDEXTERNAL