напишите больше файла, чем номер раздела - PullRequest
1 голос
/ 07 февраля 2020

Используя pyspark, я пишу список отдельных писем из таблицы улья в простые файлы в HDFS. Ограничение состоит в том, что мои файлы не должны содержать более 4,5 миллионов строк.

Я написал этот код:

df = spark.read.table(working_table).select("email").distinct()

final_df = df.withColumn(
    "rnk", 
    (F.row_number().over(Window.orderBy(F.lit(1))) / 4500000).cast("int")
)

final_df.groupBy("rnk").count().show()

+---+-------+                                                                   
|rnk|  count|
+---+-------+
|  0|4499999|
|  1|1858773|
+---+-------+


final_df.repartition("rnk").select("email").write.csv(
    working_dir_email, mode="overwrite", compression="none"
)

Это работает почти нормально, за исключением того, что у меня всегда есть дополнительный пустой файл:

hdfs dfs -ls /tmp/emails
Found 4 items
-rw-rw-r--   3 hadoop hadoop          0 2020-02-05 17:59 /tmp/emails/_SUCCESS
-rw-rw-r--   3 hadoop hadoop          0 2020-02-05 17:59 /tmp/emails/part-00000-f724cf35-5ed8-4b7a-98c2-fc992dca9ad1-c000.csv
-rw-rw-r--   3 hadoop hadoop  173936230 2020-02-05 17:59 /tmp/emails/part-00043-f724cf35-5ed8-4b7a-98c2-fc992dca9ad1-c000.csv
-rw-rw-r--   3 hadoop hadoop  292499935 2020-02-05 17:59 /tmp/emails/part-00191-f724cf35-5ed8-4b7a-98c2-fc992dca9ad1-c000.csv

Можно ли избежать этого пустого файла ? Есть ли более умный способ достичь результата без пустого файла?

1 Ответ

0 голосов
/ 07 февраля 2020

Вызывая final_df.repartition("rnk"), вы не указываете количество разделов, поэтому Spark использует количество разделов по умолчанию (200), см. repartition(). Вы можете легко проверить это: это по максимальному количеству строк вы хотите по файлу округляется в большую сторону Это дает вам количество файлов для производства:

nb_lines_split = 4500000
nb_lines = df.count()

nb_files = math.ceil(nb_lines / nb_lines_split)

df.repartition(nb_files).write.csv(path, mode="overwrite")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...