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)
在 pyspark 2.4.0中,您可以使用两种方法之一来检查表是否存在。请记住,Spark 会话 ( spark) 已创建。
table_name = 'table_name'
db_name = None
Run Code Online (Sandbox Code Playgroud)
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)
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)
尝试下面:
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)