我想通过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")