如何使用 spark 获取 hive 分区列名

Posted

技术标签:

【中文标题】如何使用 spark 获取 hive 分区列名【英文标题】:How to get the hive partition column name using spark 【发布时间】:2018-07-26 14:10:21 【问题描述】:

我在 hive 中有一张表,其 DDL 如下所示。

创建表 ABC( name 字符串) 由 ( col1 字符串, col2bigint, col3 字符串, col4字符串)

我有一个要求,我必须使用 spark scala 将 hive 表的非分区列名存储到 variable1 并将分区列名存储到 variable2。

期望的输出是:

 variable1='name'    

 variable2='col1,col2,col3,col4'

我正在遵循以下方法,但无法获得相同的方法。

val df=sql("desc default.ABC")

val df2=df.map(r => r.getString(0)).collect.toList

List[String] = List(name, col1, col2, col3, col4, # Partition Information, # col_name, col1, col2, col3, col4)

你能帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

试试这个:

import org.apache.spark.sql.functions._
val partitionsColumns = spark.catalog.listColumns("wikicc").where(col("ispartition") === true).select("name").collect().map(_.getAs[String]("name"))
val noParitionsColumns = spark.catalog.listColumns("wikicc").where(col("ispartition") === false).select("name").collect().map(_.getAs[String]("name"))
println(partitionsColumns.mkString(","))
println(noParitionsColumns.mkString(","))

【讨论】:

【参考方案2】:

试试看:

val df=sql("show partitions default.ABC")

您可以获得“分区”列。然后收集你想要的。

如果要创建表分区,可以使用 spark-sql 执行

show create table tableName

你可以得到Dataset的'createtab_stmt'列。

【讨论】:

可以解决问题,但不是优雅的操作;

以上是关于如何使用 spark 获取 hive 分区列名的主要内容,如果未能解决你的问题,请参考以下文章

怎么判断hive表是分区表,并拿到分区列的列名

源码级解读如何解决Spark-sql读取hive分区表执行效率低问题

获取 Spark 写入 Hive 元存储的所有新分区

如何将mapreduce清洗的数据添加到hive分区中国

从 Spark 替换 hive 分区

如何使用 Spark 对象获取 Hive 表的位置值?