Эффективно написать один выходной файл при разбиении по столбцам - PullRequest
0 голосов
/ 25 сентября 2018

У меня большой набор данных, df, состоящий из событий.Я хочу выписать его, разделив по годам / месяцам / датам / часам, и чтобы каждый результирующий раздел содержал только файл.

Вот фрагмент кода:

df.partitionBy("event_year", "event_month", "event_day", "event_hour").
    mode(SaveMode.Overwrite).
    parquet(s"${output_data_root}/tmp/")

Неясно, чтоделать с df до этой операции, чтобы получить один файл, так как неясно, как взаимодействуют partition(COL) и coalesce.То есть, что происходит, когда я делаю:

df.repartition(col("year"), col("month"), col("day"), col("event_hour")).coalesce(1)

(или наоборот)

Это не сработает просто до coalesce(1) (набор данных слишком большой), но изчто я могу сказать, repartition(COL) не обязательно приведет к одному разделу на набор столбцов.

1 Ответ

0 голосов
/ 26 октября 2018

Мне до сих пор неясно, что конкретно происходит под капотом, но получается, что вы просто:

df.repartition(1, col("year"), col("month"), col("day"), col("event_hour"))

Неожиданно, это НАМНОГО быстрее, чем repartition(...).coalesce, и особенно при использовании S3,определенно важно, чтобы количество файлов было минимальным.

...