Получение последней даты в разделе по году / месяцу / дню с помощью SparkSQL - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь постепенно преобразовать новые разделы исходной таблицы в новую таблицу с помощью Spark SQL. Данные в источнике и цели разделены следующим образом: /data/year=YYYY/month=MM/day=DD/. Первоначально я просто собирался выбрать МАКС year, month и day, чтобы получить самый новый раздел, но это явно не так. Есть ли хороший способ сделать это?

Если я построю дату и возьму максимум как MAX( CONCAT(year,'-','month','-',day)::date ), это было бы совершенно неэффективно, верно? Потому что для проверки самого нового раздела потребуется отсканировать все данные.

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Вы можете использовать результат show partitions, так как он будет более эффективным, так как он будет воздействовать только на метастор. Однако вы не можете просто применить максимальное значение к значению там, нам нужно сначала построить дату, а затем выполнить максимальное.

Вот пример:

from pyspark.sql import functions as F
df = sqlContext.sql("show partitions")
df.show(10, False)
date = F.to_date(F.regexp_replace(F.regexp_replace("partition", "[a-z=]", ""), "/", "-"))
df.select(F.max(date).alias("max_date")).show()

Входные значения :

+------------------------+
|partition               |
+------------------------+
|year=2019/month=11/day=5|
|year=2019/month=9/day=5 |
+------------------------+

Результат:

+----------+
|  max_date|
+----------+
|2019-11-05|
+----------+
0 голосов
/ 08 января 2020

Попробуйте ниже, чтобы получить последний раздел без чтения данных вообще, только метаданные:

spark.sql("show partitions <table>").agg(max('partition)).show
...