Skip to main content
 首页 » 编程设计

python之如何使用 Spark SQL 识别 Hive 表中的分区列

2024年09月03日29mq0036

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

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('/')] 

请您参考如下方法:

如果表没有分区,上面的代码将失败。它会给您一条错误消息,例如 "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")