如何使用 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 语句