Сплит файлы под разделы в спарк - PullRequest
0 голосов
/ 25 октября 2019

Я пишу секционированный вывод, используя приведенный ниже скрипт.

    .write
    .format("csv")
    .partitionBy("date","region")
    .option("delimiter", "\t")
    .mode("overwrite")
    .save("s3://mybucket/myfolder/")

Однако это приводит к 1 файлу под каждым разделом. Я хотел бы иметь несколько файлов одинакового размера в каждом разделе. Как я могу добиться того же. Я на спарке 2.2.

Я пытался использовать дополнительный ключ как часть перераспределения, как df_input_table.repartition($"region",$"date",$"region"). Однако это приводит к разным размерам файлов.

Я бы хотел придерживаться Spark (вместо Hive).

Ответы [ 3 ]

0 голосов
/ 25 октября 2019
.orderBy("date","region")
.repartition(10)
.write
.format("csv")
.option("delimiter", "\t")
.mode("overwrite")
.save("s3://mybucket/myfolder/")

вы получите 10 почти файлов одинакового размера.

0 голосов
/ 25 октября 2019

Перераспределение довольно дорого, потому что оно перетасовывает данные по сетям. Ограничение максимального количества записей, записанных в файл, очень желательно. Это может избежать генерации огромных файлов. В следующем выпуске Spark предоставляет пользователям два метода для установки ограничения.

// Method 1: specify the limit in the option of DataFrameWriter API. 
df.write.option("maxRecordsPerFile", 1000)
  .mode("overwrite").parquet(outputDirectory)
// Method 2: specify the limit via setting the session-scoped SQLConf configuration. 
spark.conf.set("spark.sql.files.maxRecordsPerFile", 1000)
df.write.mode("overwrite").parquet(outputDirectory)

пример - если ваш фрейм данных имеет 10 000 записей, и вы задаете maxRecordsPerFile = 1000, то spark создаст 10 файлов с одинаковым номеромрядов.

0 голосов
/ 25 октября 2019

Вы не можете контролировать размер выходных файлов в spark.

перераспределение не гарантирует размер, оно создает только файлы, основанные на ключах, скажем, если у вас есть файл, который содержит 6 строк с ключами A (5 строк) и B (1 строка), и вы устанавливаете перераспределение на 2. он создаст 2 файла, один из которых состоит из 5 строк, а другой - только из 1 строки.

Вместо этого вы можете попробовать это решение Как вы управляете размером выходного файла?

...