Nano Hash - криптовалюты, майнинг, программирование

Нужно меньше паркетных напильников

Я делаю следующий процесс

rdd.toDF.write.mode(SaveMode.Append).partitionBy("Some Column").parquet(output_path)

Однако в каждом разделе слишком много файлов паркета, и каждый из них имеет очень маленький размер, из-за чего мои следующие шаги будут очень медленными для загрузки всех файлов паркета. Есть ли лучший способ для каждого раздела сделать меньше файлов паркета и увеличить размер одного файла паркета?


  • Пожалуйста, ознакомьтесь с подробным решением проблемы a-comb" title="как эффективно читать несколько небольших паркетных файлов с помощью spark, есть ли гребень"> stackoverflow.com/questions/41840837/ 25.01.2017

Ответы:


1

Вы можете переразметить перед сохранением:

rdd.toDF.repartition("Some Column").write.mode(SaveMode.Append).partitionBy("Some Column")
31.08.2016
  • Это сработает, я верю. Однако repartition() вызывает большой сетевой трафик. Мне интересно, есть ли другой эффективный способ? 31.08.2016

  • 2

    Раньше у меня была эта проблема.

    На самом деле вы не можете управлять разделом файлов, потому что это зависит от исполнителя.

    Чтобы обойти это, используйте метод coalesce для перетасовки, и вы можете создать столько разделов, сколько хотите, но это неэффективный способ, вам также необходимо установить достаточно памяти драйвера для обработки этой операции.

    df = df.coalesce(numPartitions).write.partitionBy(""yyyyy").parquet("xxxx")
    
    31.08.2016
  • Спасибо за ваше предложение. Если я заменю объединение другим partitionBy(new HashPartitioner(numPartitions)), попытаюсь, может ли это быть более эффективным. 31.08.2016

  • 3

    Я также столкнулся с этой проблемой. Проблема в том, что если вы используете объединение, каждый раздел получает одинаковое количество файлов паркета. Теперь разные разделы имеют разный размер, поэтому в идеале мне нужно разное объединение для каждого раздела.

    28.06.2017

    4

    Это будет очень дорого, если вы откроете много маленьких файлов. Допустим, вы открываете 1k файлов, и каждый размер файла далек от значения вашего parquet.block.size.

    Вот мои предложения:

    • Создайте задание, которое сначала объединит ваши входные файлы паркета, чтобы иметь меньшее количество файлов, размер которых близок или равен parquet.block.size. Размер блока по умолчанию составляет 128 МБ, хотя его можно настроить, обновив parquet.block.size. Spark хотел бы, чтобы ваш файл паркета был близок или равен значению вашего parquet.block.size. Размер блока — это размер группы строк, буферизуемой в памяти.
    • Или обновите свое задание Spark, чтобы просто читать ограниченное количество файлов.
    • Или, если у вас есть большая машина и/или ресурсы, просто сделайте правильный тюнинг.
    30.06.2017

    5

    В запросе Hive есть способ объединить маленькие файлы в один большой. Это недоступно в искровом sql. Кроме того, сокращение spark.sql.shuffle.partitions не поможет с Dataframe API. Я попробовал решение ниже, и оно сгенерировало меньшее количество файлов паркета (с 800 файлов паркета до 29).

    Предположим, что данные загружаются в фрейм данных df

    1. Создайте временную таблицу в улье.

      df.createOrReplaceTempView("tempTable")
      spark.sql("CREATE TABLE test_temp LIKE test")
      spark.sql("INSERT INTO TABLE test_temp SELECT * FROM tempTable")
      

      test_temp будет содержать небольшие паркетные файлы.

    2. Заполнить конечную таблицу куста из временной таблицы

      spark.sql("INSERT INTO test SELECT * FROM test_temp")
      

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

    01.02.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..