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表就可以成功删除了。
当您使用 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)
从错误中可以很明显地看出您正在使用的当前数据库中不存在该表。您需要按如下方式更改您的 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)
| 归档时间: |
|
| 查看次数: |
26249 次 |
| 最近记录: |