【问题标题】:Check if table exists in hive metastore using Pyspark使用 Pyspark 检查表是否存在于配置单元元存储中
【发布时间】:2019-12-29 23:05:47
【问题描述】:

我正在尝试检查 hive 元存储中是否存在表,如果不存在,请创建表。如果表存在,则追加数据。

我有以下代码的 sn-p:

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

我无法解决值错误,因为我在 hive 元存储中创建的其他数据库的表出现相同的错误。是否有其他方法可以检查表是否存在于 hive 元存储中?

【问题讨论】:

  • 使用sql create table if not exist
  • 顺便说一句,您是否错过了代码中 table_name 中的结束引号,或者它是复制粘贴错误?
  • @JimTodd 这是一个复制粘贴错误,因为它只是一个 sn-p。实际代码要长得多。

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


【解决方案1】:

您可以为此使用 JVM 对象。

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

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

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

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

【讨论】:

  • 很好,我喜欢由此产生的直接布尔值!
【解决方案2】:

试试下面:

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")

【讨论】:

  • if len(table_name)>0:可以简化为if table_name:
【解决方案3】:

结合两个最佳答案:

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

希望对您有所帮助。

布伦特

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      在 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 Session 目录
      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
      

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

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

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

      【讨论】:

        【解决方案6】:

        我们在 databricks 中使用了以下内容来检查表是否存在,我猜这应该可行。

        tblList = sqlContext.tableNames(<your db name>)
        for tbl in tblList:
          if tbl == <table_name>:
            print("Table exists")
          else:
            print("Table doesnot exist, create the table")
        

        谢谢

        尤瓦

        【讨论】:

          【解决方案7】:

          我推荐的方式是:

          def check_table_exist(db_tbl_name):
              table_exist = False
              try:
                  spark.read.table(db_tbl_name) # Check if spark can read the table
                  table_exist = True        
              except:
                  pass
              return table_exist 
          
          check_table_exist(db_tbl_name="foodb.bar_tbl")
          

          并在你的脚本中使用这个 bool 标志!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多