我想通过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表。
答案 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