sparksql 删除配置单元表

Hey*_*ang 7 apache-spark apache-spark-sql pyspark-sql

我想通过 sparksql 删除一个配置单元表。

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

sqlContext.sql('drop table test')  //spark 1.6
spark.sql('drop table test')       //spark 2.0
Run Code Online (Sandbox Code Playgroud)

两个代码在 pyspark-shell 中都可以正常工作,我可以从 hive cli 中看到测试表不再存在。

但是,如果代码在 python 文件中,然后使用 spark-submit 提交到集群,则代码永远不会生效。

spark 2.0 甚至给出了错误

pyspark.sql.utils.AnalysisException: u"Table to drop '`try`' does not exist;"
Run Code Online (Sandbox Code Playgroud)

我已将hive-site.xml复制到 spark 中的 conf 目录中。

通过 sparksql 删除配置单元表的正确方法是什么?

更新:

我尝试比较了 spark-shell 和我使用以下代码提交的作业之间的 spark 环境

spark-submit --master yarn --deploy-mode cluster try_spark_sql.py
Run Code Online (Sandbox Code Playgroud)

在spark-shell环境下,可以看到spark.sql.catalogImplementation 设置为hive

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

spark = SparkSession.builder.appName("PythonSQL").config("spark.sql.catalogImplementation","hive").
Run Code Online (Sandbox Code Playgroud)

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

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

Aru*_*ulu 9

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

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

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

from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)
sqlContext.sql('drop table test')
Run Code Online (Sandbox Code Playgroud)


Yay*_*ule 5

从错误中可以很明显地看出您正在使用的当前数据库中不存在该表。您需要按如下方式更改您的 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
Run Code Online (Sandbox Code Playgroud)

HiveContext在 Spark 1.6 或SparkSessionSpark 2.0 中执行的任何 SQL 查询都会在 Hives 的默认数据库中搜索该表。我们需要执行查询spark.sql("USE db_name"),然后执行特定于表的 SQL,或者在数据库名称前加上表名称(例如testDB.testTable),以便查询正确执行,如上所示。


小智 5

轻微的改变......这对我有用:

spark.sql("DROP TABLE IF EXISTS table_name") 
Run Code Online (Sandbox Code Playgroud)

  • Spark.sql("如果表名存在则删除表") (5认同)