sparksql drop hive表

时间:2016-09-30 09:08:53

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

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

这两个代码在pyspak-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删除配置单元表的正确方法是什么?

更新

我尝试使用以下代码

比较spark-shell和我下属的作业之间的spark环境
spark-submit --master yarn --deploy-mode cluster try_spark_sql.py

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

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

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

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

我发现一种解决方法是使用客户端模式而不是群集模式提交作业。然后可以成功删除hive表。

3 个答案:

答案 0 :(得分:3)

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

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

请按照以下方式进行,它应该有效。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

SOURCE_MICROPHONE