如何使用 Spark SQL 识别 hive 表中的分区列

Posted

技术标签:

【中文标题】如何使用 Spark SQL 识别 hive 表中的分区列【英文标题】:How to identify the partition columns in hive table using Spark SQL 【发布时间】:2019-09-23 23:26:17 【问题描述】:

我正在尝试使用 Spark 识别 hive 表中的分区列名。我可以使用 show partitions 然后解析结果集以提取分区列来做到这一点。但是,缺点是,如果有些故事没有分区,显示分区失败。有没有更有机的方法来识别配置单元表中的分区列名。 任何帮助将不胜感激

v_query="show partitions ".format(table_name)
a=self.spark.sql(v_query)
val=a.rdd.map(list).first()
val1=''.join(val)
partition_list=[l.split('=')[0] for l in val1.split('/')]

【问题讨论】:

你做得对。以下链接提供了更强大的代码来处理此问题。***.com/questions/52148208/… 我不想显示分区。这是我试图避免的主要部分。可能有非分区表,这对他们来说会失败 【参考方案1】:

如果表未分区,上述代码将失败。它会给你一个错误信息,比如"pyspark.sql.utils.AnalysisException: u'SHOW PARTITIONS is not allowed on a table that is not partitioned"

您可以在desc命令上使用map操作来获取分区列信息。

>>> spark.sql("""desc db.newpartitiontable""").show(truncate=False)
+-----------------------+---------+-------+
|col_name               |data_type|comment|
+-----------------------+---------+-------+
|city                   |string   |null   |
|state                  |string   |null   |
|country                |string   |null   |
|tran_date              |string   |null   |
|# Partition Information|         |       |
|# col_name             |data_type|comment|
|tran_date              |string   |null   |
+-----------------------+---------+-------+

partition_exists=spark.sql("""desc db.newpartitiontable""").rdd.map(lambda x:x[0]).filter(lambda x: x.startswith("# col_name")).collect()

if len(partition_exists)>0:
    print("table is partitioned")
    partition_col=spark.sql("""show partitions test_dev_db.newpartitiontable""").rdd.map(lambda x:x[0]).map(lambda x : [l.split('=')[0] for l in x.split('/')]).first()
    print("Partition column is:",partition_col)
else:
    print("table is not partitioned")

【讨论】:

谢谢维克兰特。看起来不错。但是,我们可以避免显示分区并以某种方式从描述表中解析分区列名称吗? 是的,可以做到。我在另一个问题上回答了类似的事情。请检查。 能否提供链接 这是链接,看来这个问题只是你提出的。***.com/questions/57011003/…

以上是关于如何使用 Spark SQL 识别 hive 表中的分区列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spark 将镶木地板文件加载到 Hive 表中?

在 spark 中跳过 hive 表中丢失的文件以避免 FileNotFoundException

Spark SQL 到 Hive 表 - 日期时间字段小时错误

无法使用 pyspark 从 hive 表中查询复杂的 SQL 语句

数据存储在对象存储中时从 Spark SQL 访问 Hive 表

了解如何在 Spark 中执行 Hive SQL