【问题标题】:How do I find if a Hive table is defined as an external table through PySpark?如何通过 PySpark 查找 Hive 表是否定义为外部表?
【发布时间】:2018-08-07 20:05:17
【问题描述】:

对于上下文 - 数据位于 S3 上,以 Hive 表的形式编写。我在我的本地机器上运行一些 Jupyter 笔记本,这些笔记本应该将 S3 数据作为 Hive 表指向,而元数据存储在 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 如何认为我的表是外部表?我需要更改创建表格的方式吗?

【问题讨论】:

    标签: apache-spark hive pyspark


    【解决方案1】:
    1. 您应该通过创建外部表从 s3 访问数据。假设这张桌子叫做 T1。
    2. 如果表 T1 定义使用分区,则需要修复表以加载分区。
    3. 您不能截断外部表 T1。您应该只阅读它。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-25
        • 1970-01-01
        相关资源
        最近更新 更多