使用Pyspark检查表在Hive Metastore中是否存在

时间:2019-08-25 13:15:03

标签: python-3.x apache-spark hive pyspark apache-spark-sql

我正在尝试检查配置单元metastore中是否存在表,如果没有,请创建该表。如果该表存在,请追加数据。

我有以下代码段:

spark.catalog.setCurrentDatabase("db_name")
db_catalog = spark.catalog.listTables(dbName = 'table_name)
if any(table_name in row for row in db_catalog):
    add data
else:
    create table

但是,我遇到一个错误。

>>> ValueError: Some of types cannot be determined after inferring

我无法解决值错误,因为在配置单元metastore中创建的其他数据库表遇到相同的错误。还有另一种方法来检查配置单元metastore中是否存在表?

6 个答案:

答案 0 :(得分:4)

您可以为此使用JVM对象。

if spark._jsparkSession.catalog().tableExists('db_name', 'tableName'):
  print("exist")
else:
  print("Not Exist")

用于Python功能的Py4j套接字。其他操作使用JVM SparkContext

在Spark Scala中,您可以直接访问。

spark.catalog.tableExists("dbName.tableName")

答案 1 :(得分:2)

结合以下两个最佳答案:

tblList = sqlContext.tableNames("db_name")
if table_name in tblList:
    print("Table exists")
    # insert code to insert/append
else:
    print("Table does not Exist")
    # insert code to create

希望有帮助。

布伦特

答案 2 :(得分:1)

尝试以下:

table_list=spark.sql("""show tables in your_db""")
table_name=table_list.filter(table_list.tableName=="your_table").collect()
if len(table_name)>0:
    print("table found")
else:
    print("table not found")

答案 3 :(得分:0)

我们在数据块中使用了以下内容来检查表是否存在,我猜这应该可以工作。

**a=Quiz.objects.all() 
print(a[0].assignment_set.all())**

谢谢

Yuva

答案 4 :(得分:0)

避免创建类似列表的结构的另一个建议:

if (spark.sql("show tables in <DATABASE>")
         .filter(col("tableName") == "<TABLENAME>")
         .count() > 0):
    print('found')   
else:
    print('not found')

答案 5 :(得分:0)

在pyspark 2.4.0 中,您可以使用两种方法之一来检查表是否存在。请记住,Spark会话(spark)已创建。

table_name = 'table_name'
db_name = None
  1. 从Spark Session的上下文创建 SQL上下文
from pyspark.sql import SQLContext

sqlContext = SQLContext(spark.sparkContext)
table_names_in_db = sqlContext.tableNames(db_name)

table_exists = table_name in table_names_in_db
  1. 使用Spark会话目录
tables_collection = spark.catalog.listTables(db_name)
table_names_in_db = [table.name for table in tables_collection]

table_exists = table_name in table_names_in_db

我会使用第一种方法,因为第二种方法似乎会触发火花作业,因此速度较慢。

为了编写或追加表,您可以使用以下方法

df.write.mode('append').saveAsTable(table_name)