Size: a a a

2020 September 07

DZ

Dmitry Zuev in Moscow Spark
Не знаю на счет фреймлесс, эта та часть которую я стараюсь не трогать
источник

DZ

Dmitry Zuev in Moscow Spark
у тебя точно T: Order
источник

DZ

Dmitry Zuev in Moscow Spark
и тогда можно  будет абстрагироватся, но если датафрейм то все равно придется уточнить тип
источник

DZ

Dmitry Zuev in Moscow Spark
Так можно придумать некоторый adt где перечислить все известные типы, из него макросом сгенерить case when что нибудь такое
источник

DZ

Dmitry Zuev in Moscow Spark
но это всё шляпа
источник

ИК

Иван Калининский... in Moscow Spark
Dmitry Zuev
и тогда можно  будет абстрагироватся, но если датафрейм то все равно придется уточнить тип
придется уточнить, ведь сделать UDF для конкретного типа не проблема, но если я пишу SomeClass[T], T когда-то должен быть выведен
источник

ИК

Иван Калининский... in Moscow Spark
Dmitry Zuev
Так можно придумать некоторый adt где перечислить все известные типы, из него макросом сгенерить case when что нибудь такое
макросы не освоены ( Может вообще в скала-чат перепостить?
источник

DZ

Dmitry Zuev in Moscow Spark
не, тут проблема в том что ты делаешь
источник

DZ

Dmitry Zuev in Moscow Spark
а не в скале
источник

GT

Gennady Timofeev in Moscow Spark
Иван Калининский
Коллеги, есть намерение написать UDF для Spark на Scala, которая будет осуществлять поиск по заранее созданному из исходного датафрейма бинарному дереву с _интервалами_ значений и (Tuple3=4(a: T,b: T, n: Int), где T - тип данных, допускающий сравнение, a <= b, n - целое положительное число). То есть, в UDF передается значение одного поля X (x: T), затем осуществляется поиск по бинарному дереву с условием x >= a && x < b, возвращается n или 0, если условие не выполняется для x, a, b. Проблема в том, что это нужно делать с произвольным типом данных, который имеет поле X.


Планирую, что проблему можно решить, если создать параметризованный класс, объект-компаньон которого сделает вывод типа из поля исходного датафрейма, передаст коллекцию с уже определенным типом в конструктор, а после этого можно использовать метод класса как UDF на произвольном поле целевого датафрейма. Но я не вижу способа вывести тип данных, кроме как в .collect сделать pattern matсhing по типам полей, где будет описан каждый возможный вариант преобразования, например LongType >= Long ; DecimalType(m,n) => BigDecimal(m,n) и так далее, но опасаюсь, что такой подход совсем неправильный. Посоветуйте, пожалуйста, как это можно сделать, сохранив вывод типа данных в рантайме

Версия Spark 2.4.0, Scala 2.11.12

Раз уж сегодня речь заходила про Frameless, @zuynew , подскажи, пожалуйста, может там что-то есть/появилось для датафреймов, но я читал, что только для Dataset, датафреймы только на стадии Proof of Concept, потом их выпилили. Самостоятельно переписать на основе найденного пулл-реквеста frameless с поддержкой датафреймов не удается (версия Scala в том пулл-реквесте 2.11.8), хотя кода там не так много. Если кто-то знает, как помочь, пишите в личку, буду благодарен

Сейчас указанная операция делается через bigDF left join smallDF on x >= a and x < b. Есть очевидные недостатки: длительное выполнение, полная сортировка, возможно появление дубликатов, если исходный датафрейм содержит пересечения интервалов. Зато с типами данных полный порядок

Еще один вариант - сделать огромный case when (условие с литералами a, b) then n. Конечно, речь о его аналоге в DataFrame API when()….otherwise(), но его даже не хочется пробовать, потому что может быть генерация десятков тысяч условий, и выполнение все равно будет линейным,или  нужно очень извратиться и сделать «деревоподобный» case when then (
А вы можете попробовать через датасет апи? Row => case class (для типов) => применить нужную функцию для поиска по дереву к нужному полю
источник

DZ

Dmitry Zuev in Moscow Spark
если датасет то тут всё мега изи
источник

DZ

Dmitry Zuev in Moscow Spark
накладываешь T : Order и в путь
источник

ИК

Иван Калининский... in Moscow Spark
Gennady Timofeev
А вы можете попробовать через датасет апи? Row => case class (для типов) => применить нужную функцию для поиска по дереву к нужному полю
кейс класс с generic параметром?
источник

GT

Gennady Timofeev in Moscow Spark
Иван Калининский
кейс класс с generic параметром?
Нет, конкретный вполне.

Ну то есть у меня вопрос, на сколько вы хотите сделать обобщенную имплементацию.
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Иван Калининский
кейс класс с generic параметром?
Ну можно и так, главное чтобы он был Order :)
источник

DZ

Dmitry Zuev in Moscow Spark
ой вей, вы на dataframe не получите T: Order
источник

ПФ

Паша Финкельштейн... in Moscow Spark
Dmitry Zuev
ой вей, вы на dataframe не получите T: Order
Но на датасете же можно
источник

DZ

Dmitry Zuev in Moscow Spark
источник

ИК

Иван Калининский... in Moscow Spark
Gennady Timofeev
Нет, конкретный вполне.

Ну то есть у меня вопрос, на сколько вы хотите сделать обобщенную имплементацию.
Исходная структура: датафрейм с двумя полями произвольного типа и одним дополнительным полем определенного типа, датафрейм с одним полем произвольного типа, таким же, как те два поля в первом
Первый датафрейм когда-то был получен из второго и сохранен
Тип поля определяется при чтении датафреймов, это не Dataset
источник

ИК

Иван Калининский... in Moscow Spark
если реализовывать с конкретными типами, то нужно перепроектировать
источник