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

Cry*_*sie 7 hive python-3.x apache-spark apache-spark-sql pyspark

我正在尝试检查 hive 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
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误。

>>> ValueError: Some of types cannot be determined after inferring
Run Code Online (Sandbox Code Playgroud)

我无法解决值错误,因为在 hive Metastore 中创建的其他数据库表出现相同的错误。是否有另一种方法来检查 hive Metastore 中是否存在表?

Yuk*_*mar 32

为此,您可以使用 JVM 对象。

if spark._jsparkSession.catalog().tableExists('db_name', 'tableName'):
  print("exist")
else:
  print("Not Exist")
Run Code Online (Sandbox Code Playgroud)

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

在Spark Scala中可以直接访问。

spark.catalog.tableExists("dbName.tableName")
Run Code Online (Sandbox Code Playgroud)


Grz*_*orz 7

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

table_name = 'table_name'
db_name = None
Run Code Online (Sandbox Code Playgroud)
  1. 从 Spark 会话的上下文创建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
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)

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

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

df.write.mode('append').saveAsTable(table_name)
Run Code Online (Sandbox Code Playgroud)


vik*_*ana 5

尝试下面:

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")
Run Code Online (Sandbox Code Playgroud)