我正在尝试使用Spark识别蜂巢表中的分区列名称。我能够使用show partitions做到这一点,然后解析结果集以提取分区列。但是,缺点是,如果有些故事如果没有分区,则show分区会失败。是否有更有机的方法来识别配置单元表中的分区列名称。 任何帮助将不胜感激
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('/')]
答案 0 :(得分:2)
如果表未分区,则以上代码将失败。它会给您类似"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")