sparksql drop hive table



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

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

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").

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

我发现的一个解决方案是使用客户端模式而不是集群模式提交作业。

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

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

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

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

从错误中可以清楚地看出,该表在当前使用的数据库中不存在。您需要按照如下方式更改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查询,都会在hive的default数据库中查找表。我们需要执行查询spark.sql("USE db_name"),然后执行特定于表的SQL,或者用(例如testDB.testTable)的前缀数据库的名称,以便如上所示正确执行查询。

略有变化…

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

相关内容

  • 没有找到相关文章

最新更新