我想通过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").
型
但它对环境没有任何影响。
我发现的一个解决方法是使用客户端模式而不是集群模式提交作业。然后可以成功删除配置单元表。
3条答案
按热度按时间vecaoik11#
当你使用PySpark shell时,Spark有内置的Hive支持,默认的SQLContext实现(可以作为sqlContext使用)是HiveContext。
如果您使用的是不提供Hive功能的普通SQLContext,则在应用程序中。
请按下面的方法做,它应该会起作用。
字符串
dgjrabp22#
从错误中可以清楚地看到,该表在您正在使用的当前数据库中不存在。您需要更改SQL,如下所示:
字符串
在Spark 1.6中使用
HiveContext
或在Spark 2.0中使用SparkSession
执行的任何SQL查询,在Hives的default数据库中搜索表。我们需要执行查询spark.sql("USE db_name")
,然后执行特定于该表的SQL,或者在Database的名称前面加上Table的名称(例如testDB.testTable
),以便如上所示正确执行查询。nzkunb0c3#
小小的改变......这对我很有效:
字符串