Size: a a a

2020 November 02

AE

Alexey Evdokimov in Data Engineers
и самих классификаторов много, и переставлять по конвейеру сатанисты их хотят в целом как попало
источник

AE

Alexey Evdokimov in Data Engineers
так что поди-ка поддержи схему на лету, если она ни в одной точке заранее не известна до запуска, и 90% полей вообще смысла не имеет, а терять их нельзя
источник

AS

Andrey Smirnov in Data Engineers
я помню мы уже обсуждали это, и так окружающие не поняли (я точно), чем не подходит dataframe, название/тип колонок известны, а непонятные поля от заказчика можно же потом просто приджойнить в результат
источник

AZ

Anton Zadorozhniy in Data Engineers
обычная задача для разработки DSL, можно свой промежуточный формат данных сделать (перейти от схемы к грамматике так сказать), ну или генерить датафреймы из метаданных
источник

AE

Alexey Evdokimov in Data Engineers
ну вот по какому-то такому пути мы и идём. есть частичная схема, когда эвристики между собой договариваются, в какие поля они будут писать и читать свои проперти
источник

AE

Alexey Evdokimov in Data Engineers
но теперь надо делать выборки
источник

AE

Alexey Evdokimov in Data Engineers
а для того чтобы группировать записи в цепочки, если эвристика того требует, я ток до .repartitionAndSortWithinPartitions с кастомными партишионером и компаратором додумался, потому что хз как будет проще.
источник

AE

Alexey Evdokimov in Data Engineers
а исходная запись таскается до самого конца через пропертю 'source' прям как она была из CSV прочитана в виде Text. ну или сконверчена в таковую из паркета на лету.

способа таскать её компактнее я тоже не нашёл
источник

AZ

Anton Zadorozhniy in Data Engineers
я думаю надо начать с DSL, а потом уже смотреть как это реализовывать
источник

AZ

Anton Zadorozhniy in Data Engineers
как мы все помним "преждевременная оптимизация есть корень всех зол"
источник

AE

Alexey Evdokimov in Data Engineers
дык не до жиру. был бы рад таскать всё в нормальном типизированном виде, но тогда памяти не хватат ни на что
источник

ИК

Иван Калининский... in Data Engineers
Ребята, привет!
Подскажите, пожалуйста, можно ли сделать в Spark методом RDD.zipPartitions вот такое:

1. Если принять, что к rdd1 и rdd2 уже применен один и тот же партишенер и выполнен .sortWithinPartitions, можно ли на этапе .zipPartitions сделать что-то вроде mergeSort, объединить два отсортированных итератора в один отсортированный?
Вот так очень просто: rdd1.zipPartitions(rdd2) { (iter1, iter2) => iter1 ++ iter2 }
но совсем не хочется после сортировки и слияния делать еще одну сортировку

2. Произвести anti join, то есть, сделать примерно так:
def getKey(row: Row) = ???
rdd1.zipPartitions(rdd2) {
 (iter1, iter2) => iter1.filterNot( row => iter2map(getKey).toSet.contains(getKey(row)))
}

Буду очень благодарен за конкретные примеры
источник

AE

Alexey Evdokimov in Data Engineers
есть вон GPX для треков, например. но тока он сделан на DOM, и паршивенький документ на 600 килов XMLя весит в памяти ~2100 метров распакованный
источник

ИК

Иван Калининский... in Data Engineers
Anton Zadorozhniy
справедливости ради что надо сказать что мердж "как у больших" нормально и айсберг не может, прежде всего потому что пока не умеет засовывать информацию о своих бакетах в спарк; ну и перфоманс только-только начинаем смотреть и чинить...
Вот это очень интересно, есть какой-то адекватный способ указать Spark, что файлы относятся к конкретным бакетам? Пока придумал только создавать описание таблицы в Hive и указывать, что по некоторому полю сделан bucket by (количество файлов). Выглядит такой подход весьма хрупким, к тому же, таких описаний в Hive нужно будет делать много, сомневаюсь, что взлетит
источник

AZ

Anton Zadorozhniy in Data Engineers
Иван Калининский
Вот это очень интересно, есть какой-то адекватный способ указать Spark, что файлы относятся к конкретным бакетам? Пока придумал только создавать описание таблицы в Hive и указывать, что по некоторому полю сделан bucket by (количество файлов). Выглядит такой подход весьма хрупким, к тому же, таких описаний в Hive нужно будет делать много, сомневаюсь, что взлетит
собственно никакого другого способа сейчас нет, только через метастор
источник

AZ

Anton Zadorozhniy in Data Engineers
это работает, с учетом того насколько большой прирост производительности оно того стоит (держать все в метасторе)
источник

ИК

Иван Калининский... in Data Engineers
Anton Zadorozhniy
это работает, с учетом того насколько большой прирост производительности оно того стоит (держать все в метасторе)
понял, спасибо!
источник

AZ

Anton Zadorozhniy in Data Engineers
или в СУБД пихайте, любая не вырожденная МРР СУБД умеет делать такой мап-сайд джоин (без перераспределения), а некоторые умеют еще и покруче трюки делать
источник

AS

Andrey Smirnov in Data Engineers
Иван Калининский
Ребята, привет!
Подскажите, пожалуйста, можно ли сделать в Spark методом RDD.zipPartitions вот такое:

1. Если принять, что к rdd1 и rdd2 уже применен один и тот же партишенер и выполнен .sortWithinPartitions, можно ли на этапе .zipPartitions сделать что-то вроде mergeSort, объединить два отсортированных итератора в один отсортированный?
Вот так очень просто: rdd1.zipPartitions(rdd2) { (iter1, iter2) => iter1 ++ iter2 }
но совсем не хочется после сортировки и слияния делать еще одну сортировку

2. Произвести anti join, то есть, сделать примерно так:
def getKey(row: Row) = ???
rdd1.zipPartitions(rdd2) {
 (iter1, iter2) => iter1.filterNot( row => iter2map(getKey).toSet.contains(getKey(row)))
}

Буду очень благодарен за конкретные примеры
не пробовал эту библиотеку?
https://github.com/Gelerion/spark-dataset-custom-partitioner
источник

ИК

Иван Калининский... in Data Engineers
Не пробовал, посмотрю, спасибо!
источник