【问题标题】:sparksql drop hive tablesparksql 删除配置单元表
【发布时间】:2017-02-08 19:29:07
【问题描述】:

我想通过 sparksql 删除一个 hive 表。

在安装了 hadoop 2.6、hive 2.0、spark 1.6 和 spark 2.0 的集群中。我在两个版本的 pyspark shell 和 spark-submit 作业中尝试了以下代码。

sqlContext.sql('drop table test')  //spark 1.6
spark.sql('drop table test')       //spark 2.0

两个代码在 pyspark-shell 中都可以正常工作,我可以从 hive cli 中看到 test 表不再存在。

但是,如果代码在 python 文件中,然后使用 spark-submit 提交到集群,则代码永远不会生效。

spark 2.0 甚至给出了关于

的错误
pyspark.sql.utils.AnalysisException: u"Table to drop '`try`' does not exist;"

我已将 hive-site.xml 复制到 spark 的 conf 目录中。

通过 sparksql 删除 hive 表的正确方法是什么?

更新:

我尝试比较了 spark-shell 和我使用以下代码提交的作业之间的 spark 环境

spark-submit --master yarn --deploy-mode cluster try_spark_sql.py

在 spark-shell 环境中,我可以看到 spark.sql.catalogImplementation 设置为 hive

在使用上述代码提交的作业中。环境不包含 spark.sql.catalogImplementation 我尝试使用以下代码进行设置:

spark = SparkSession.builder.appName("PythonSQL").config("spark.sql.catalogImplementation","hive").

但它对环境没有任何影响。

我发现的一种解决方法是使用 client 模式而不是 cluster 模式提交作业。那么hive表就可以成功drop了。

【问题讨论】:

  • 问题,您是否在 spark-submit 脚本中使用 sqlContext 上下文?
  • 当然,我没有添加那部分代码。 sparkcontx 像往常一样初始化,使用 sqllContxt.sql 可以成功读取 .orc 文件。

标签: apache-spark apache-spark-sql pyspark-sql


【解决方案1】:

当您使用 PySpark shell 时,Spark 具有内置的 Hive 支持,默认的 SQLContext 实现(作为 sqlContext 可用)是 HiveContext。

如果您使用不提供 Hive 功能的普通 SQLContext,则在您的应用程序中。

请按如下操作,它应该可以工作。

from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)
sqlContext.sql('drop table test')

【讨论】:

  • 抱歉,因为我在度假,所以回复晚了。我重新检查了我的代码,发现sqlContext = HiveContext(sc) 已经存在,虽然我没有from pyspark.sql import HiveContext。添加这行代码后,spark 还是会报错pyspark.sql.utils.AnalysisException: u"Table to drop 'try' does not exist;"。也许是因为集群是使用 spark 2.0 配置的。
  • 但是我现在找到了一个有用的解决方法。使用--mode client 而不是--mode cluster提交作业可以成功删除表。
【解决方案2】:

从错误中可以清楚地看出该表在您正在使用的当前数据库中不存在。您需要按如下方式更改您的 SQL:

sqlContext.sql('DROP TABLE IF EXISTS db_name.table_name')  //spark 1.6
spark.sql('DROP TABLE IF EXISTS db_name.table_name')       //spark 2.0

在 Spark 1.6 中使用 HiveContext 或在 Spark 2.0 中使用 SparkSession 执行的任何 SQL 查询都会在 Hives 的 default 数据库中搜索表。我们需要执行查询spark.sql("USE db_name"),然后执行特定于表的SQL 或为数据库的名称添加前缀 使用表的名称(例如@987654325 @) 以使查询如上所示正确执行。

【讨论】:

  • 我们如何获得sqlContext.sql('DROP TABLE IF EXISTS db_name.table_name') 的返回值?我想知道命令是否执行成功。
  • 在 Spark 2.0 中,我们可以使用 sparkSession.catalog.listTables() 返回包含给定数据库中所有表的 Dataset[Table] 或返回布尔值的 spark.catalog.tableExists
【解决方案3】:

轻微的变化...这对我有用:

spark.sql("DROP TABLE IF EXIST table_name") 

【讨论】:

  • spark.sql("DROP TABLE IF EXISTS table_name")
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2019-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多