Основываясь на ответе Викранта, вот более общий способ извлечения значений столбцов раздела непосредственно из метаданных таблицы, который позволяет избежать сканирования Spark всех файлов в таблице.
Во-первых, если ваши данные еще не зарегистрированы в каталоге, вы захотите сделать это, чтобы Spark мог видеть детали раздела. Здесь я регистрирую новую таблицу с именем data
.
spark.catalog.createTable(
'data',
path='/path/to/the/data',
source='parquet',
)
spark.catalog.recoverPartitions('data')
partitions = spark.sql('show partitions data')
Однако, чтобы показать автономный ответ, я вручную создам partitions
DataFrame, чтобы вы могли видеть, как он будет выглядеть, а также решение для извлечения из него определенного значения столбца.
from pyspark.sql.functions import (
col,
regexp_extract,
)
partitions = (
spark.createDataFrame(
[
('/country=usa/region=ri/',),
('/country=usa/region=ma/',),
('/country=russia/region=siberia/',),
],
schema=['partition'],
)
)
partition_name = 'country'
(
partitions
.select(
'partition',
regexp_extract(
col('partition'),
pattern=r'(\/|^){}=(\S+?)(\/|$)'.format(partition_name),
idx=2,
).alias(partition_name),
)
.show(truncate=False)
)
Результат этого запроса:
+-------------------------------+-------+
|partition |country|
+-------------------------------+-------+
|/country=usa/region=ri/ |usa |
|/country=usa/region=ma/ |usa |
|/country=russia/region=siberia/|russia |
+-------------------------------+-------+
Решение в Scala будет очень похоже на это, за исключением того, что вызов regexp_extract()
будет выглядеть немного иначе:
.select(
regexp_extract(
col("partition"),
exp=s"(\\/|^)${partitionName}=(\\S+?)(\\/|$$)",
groupIdx=2
).alias(partitionName).as[String]
)
Опять же, преимущество запроса значений разделов таким способом заключается в том, что Spark не будет сканировать все файлы в таблице, чтобы получить ответ. Если у вас есть таблица с десятками или сотнями тысяч файлов, вы значительно сэкономите время.
person
Nick Chammas
schedule
14.01.2021
show partitions dbname.tablename
и выберите последнюю строку возвращаемого фрейма данных, чтобы получить последний раздел. - person philantrovert   schedule 08.03.2019