use*_*470 4 python-2.7 apache-spark-sql pyspark
我需要帮助来使用 PySpark 查找 Hive 表的唯一分区列名称。该表可能有多个分区列,并且最好输出应返回 Hive 表的分区列列表。
如果结果还包括分区列的数据类型,那就太好了。
任何建议都会有帮助。
可以使用 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
以下片段
# 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)
归档时间: |
|
查看次数: |
8752 次 |
最近记录: |