使用 PySpark 从表中识别分区键列

use*_*470 4 python-2.7 apache-spark-sql pyspark

我需要帮助来使用 PySpark 查找 Hive 表的唯一分区列名称。该表可能有多个分区列,并且最好输出应返回 Hive 表的分区列列表。

如果结果还包括分区列的数据类型,那就太好了。

任何建议都会有帮助。

vik*_*ana 7

可以使用 desc 来完成,如下所示:

df=spark.sql("""desc test_dev_db.partition_date_table""")
>>> df.show(truncate=False)
+-----------------------+---------+-------+
|col_name               |data_type|comment|
+-----------------------+---------+-------+
|emp_id                 |int      |null   |
|emp_name               |string   |null   |
|emp_salary             |int      |null   |
|emp_date               |date     |null   |
|year                   |string   |null   |
|month                  |string   |null   |
|day                    |string   |null   |
|# Partition Information|         |       |
|# col_name             |data_type|comment|
|year                   |string   |null   |
|month                  |string   |null   |
|day                    |string   |null   |
+-----------------------+---------+-------+
Run Code Online (Sandbox Code Playgroud)

由于该表已分区,因此您可以在此处看到分区列信息及其数据类型。

看来您只对分区列名称及其各自的数据类型感兴趣。因此我正在创建一个元组列表。

partition_list=df.select(df.col_name,df.data_type).rdd.map(lambda x:(x[0],x[1])).collect()

>>> print partition_list
[(u'emp_id', u'int'), (u'emp_name', u'string'), (u'emp_salary', u'int'), (u'emp_date', u'date'), (u'year', u'string'), (u'month', u'string'), (u'day', u'string'), (u'# Partition Information', u''), (u'# col_name', u'data_type'), (u'year', u'string'), (u'month', u'string'), (u'day', u'string')]

partition_details = [partition_list[index+1:] for index,item in enumerate(partition_list) if item[0]=='# col_name']

>>> print partition_details
[[(u'year', u'string'), (u'month', u'string'), (u'day', u'string')]]
Run Code Online (Sandbox Code Playgroud)

如果表未分区,它将返回空列表。希望这可以帮助。


小智 7

以下片段

  1. 获取给定表的列
  2. 过滤掉分区列
  3. 从分区列中提取(名称,数据类型)元组
# s: pyspark.sql.session.SparkSession
# table: str

# 1.  Get table columns for given table
columns = s.catalog.listColumns(table)

# 2. Filter out partition columns
partition_columns = list(filter(lambda c: c.isPartition , columns))

# 3. Now you can extract the name and dataType (among other attributes)
[ (c.name, c.dataType) for c in partition_columns ]
Run Code Online (Sandbox Code Playgroud)