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

Posted

技术标签:

【中文标题】使用 Pyspark 和 Hive 显示来自特定数据库的表【英文标题】:Showing tables from specific database with Pyspark and Hive 【发布时间】:2017-02-27 15:09:41 【问题描述】:

在 Hive 实例中有一些数据库和表。我想显示一些特定数据库的表(比如说 3_db)。

+------------------+--+
|  database_name   |
+------------------+--+
| 1_db             |
| 2_db             |
| 3_db             |
+------------------+--+

如果我从那里的 bash-nothing complex 进入直线,我只需执行以下操作:

show databases;
show tables from 3_db;

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

sqlContext.sql('show databases').show()
sqlContext.sql('show tables from 3_db').show()

似乎有什么问题,为什么相同的代码在一个地方有效而在另一个地方无效?

【问题讨论】:

【参考方案1】:
sqlContext.sql("show tables in 3_db").show()

【讨论】:

【参考方案2】:

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

spark = SparkSession.builder.getOrCreate()
spark.catalog.listTables("3_db")

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

【讨论】:

SparkSession 是更“现代”的方式,而不是 sqlContext。请点赞。【参考方案3】:

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


使用 SQL

这是最有效的方法:

spark_session = SparkSession.builder.getOrCreate()
spark_session.sql("show tables in db_name").show()

使用catalog.listTables()

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

spark_session = SparkSession.builder.getOrCreate()
spark_session.catalog.listTables("db_name")

【讨论】:

以上是关于使用 Pyspark 和 Hive 显示来自特定数据库的表的主要内容,如果未能解决你的问题,请参考以下文章

从 PySpark 查询 Hive 表时出错

PySpark Hive 查询未显示输出

来自 Hive 的 Pyspark 数据中带有毫秒 'YYYY-MM-DD hh:mm:ss.SSS' 的日期

如何使用 Hive 上下文中的 Pyspark 调用用 Java 编写的 Hive UDF

无法使用 Pyspark 访问外部 Hive 元存储

PySpark/Hive:如何使用 LazySimpleSerDe 创建表以转换布尔值“t”/“f”?