sparksql drop hive table

icomxhvb  于 2023-11-21  发布在  Apache
关注(0)|答案(3)|浏览(148)

我想通过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命令中看到 *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").


但它对环境没有任何影响。
我发现的一个解决方法是使用客户端模式而不是集群模式提交作业。然后可以成功删除配置单元表。

vecaoik1

vecaoik11#

当你使用PySpark shell时,Spark有内置的Hive支持,默认的SQLContext实现(可以作为sqlContext使用)是HiveContext。
如果您使用的是不提供Hive功能的普通SQLContext,则在应用程序中。
请按下面的方法做,它应该会起作用。

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

字符串

dgjrabp2

dgjrabp22#

从错误中可以清楚地看到,该表在您正在使用的当前数据库中不存在。您需要更改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,或者在Database的名称前面加上Table的名称(例如testDB.testTable),以便如上所示正确执行查询。

nzkunb0c

nzkunb0c3#

小小的改变......这对我很有效:

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

字符串

相关问题