паркет по одной записи добавлять. java, делаю датасет с новой строкой, читаю паркет, делаю union + coalesce(1) с новой строкой, кеширую StorageLevel.MEMORY_ONLY()
засада в том что если я полученный датасет записываю в то же место, он ругается, что старый файл в папке таблицы пропал. я не понимаю зачем он еще что-то читает с папки таблицы, все что нужно вроде в памяти кеша. я понимаю что могу записать в другое место, вопрос скорее теоретический почему не прокатывает ?
Я не уверен в правильности своего ответа, но дело, думаю, в том, что план запроса - это ацикличный граф, и ты как бы не можешь просто взять и в середине или в конце изменить исходные шаги.
так cache вроде терминальня команда, план выполнился, в память затянул. если я обращаюсь к данным датасета, они же в памяти, зачем падать из-за того что сам же файлик затираешь
Возможно, связь между данными на диске и в кэше для спарка полностью не разрывается на каком-то из уровней. Не знаю, честно. Но выглядит так.
Cache/persist не Action, не терминальная команда. Она такая же ленивая, как и прочие трансформации. Нужно хоть раз затянуть данные до записи, тогда, возможно (возможно) прокатит. Затянуть можно так: dfCached.foreach(_ => ()) И лучше avro в этом кейсе. На худой конец текст (json, csv).
лучше каунт
А не .show(1)?
нет, show(1) точно не стоит, тк он посчитает минимальное количество партиций, для того, чтобы отобразить результат - скорее всего это будет одна партиция и только она уедет в кеши. В итоге у тебя будет partial caching
Подожди, могут кэшироваться не все партиции?
конечно
Да, ты прав
Если вместо кэша сделать чекпоинт, то прокатит, но он просто промежуточные данные сложит в темп папку
Обсуждают сегодня