使用Pyspark和Hive显示特定数据库中的表

Kei*_*thx 11 python hive apache-spark pyspark beeline

在Hive实例中包含一些数据库和表.我想显示一些特定数据库的表(比方说3_db).

+------------------+--+
|  database_name   |
+------------------+--+
| 1_db             |
| 2_db             |
| 3_db             |
+------------------+--+
Run Code Online (Sandbox Code Playgroud)

如果我从bash进入beeline - 那里没什么复杂的,我只是做以下事情:

show databases;
show tables from 3_db;
Run Code Online (Sandbox Code Playgroud)

当我通过ipython notebeook使用pyspark时 - 我的廉价技巧在那里不起作用并在第二行(显示来自3_db的表)给我错误:

sqlContext.sql('show databases').show()
sqlContext.sql('show tables from 3_db').show()
Run Code Online (Sandbox Code Playgroud)

什么似乎是错的,为什么相同的代码在一个地方工作而在另一个地方不起作用?

Dav*_*itz 19

sqlContext.sql("show tables in 3_db").show()
Run Code Online (Sandbox Code Playgroud)


ael*_*bao 11

另一种可能性是使用Catalog方法:

spark = SparkSession.builder.getOrCreate()
spark.catalog.listTables("3_db")
Run Code Online (Sandbox Code Playgroud)

请注意,在 PySpark 中,此方法返回 alist而在 Scala 中,它返回 a DataFrame

  • SparkSession 是更“现代”的方式,而不是 sqlContext。请点赞。 (2认同)

Gio*_*ous 7

有两种可能的方法可以实现这一目标,但它们在效率方面存在很大差异。


使用SQL

这是最有效的方法:

spark_session = SparkSession.builder.getOrCreate()
spark_session.sql("show tables in db_name").show()
Run Code Online (Sandbox Code Playgroud)

使用catalog.listTables()

与之前的方法相比,以下方法效率更低,因为它还加载表的元数据:

spark_session = SparkSession.builder.getOrCreate()
spark_session.catalog.listTables("db_name")
Run Code Online (Sandbox Code Playgroud)