powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Инструмент для работы с SQL движками Impala/Hive
22 сообщений из 97, страница 4 из 4
Инструмент для работы с SQL движками Impala/Hive
    #39525442
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!pihelу меня сейчас установлена сборка от клаудеры, в которой нет Tez. Видимо придется поплатиться за свою лень и теперь как-то самому ставить tez
по моим замерам Tez заметно медленее импалы. на клоудере вместо импалы, есть смысл пробовать Spark как движок к Hive (ставить через parcel), Tez на клоудере сомнительная затея.Вот ты же сам понимаешь гибкость.

Если логика на SQL и данные в HDFS, я могу выбирать движок как минимум из
Impala
Spark
Tez
HiveMR

Как я уже замечал раньше не все функции совместимы, но проблема решается использованием UDF.

Когда не все решаемо на SQL => spark + scala.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525443
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pihelYo.!,

спасибо, тоже тогда буду пробовать на map reduce (в моем случае hive) посчитать агрегаты, а дальше что-то другое.Перечитай топик еще раз и не надо заниматься херней.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525471
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan DurakYo.! map-reduce делает ETL, тяжелые расчеты и готовит широкие таблички, которые импалой смотрят отчетные системы и юзера. .
Скажите, какие отчетные системы юзают импалу?? Самописные или ентерпрайз какие-то?С этого топик начинался (только с позиции разработчика).
Всё что знает ODBC/JDBC может тянуть данные из Impala via SQL.

В моем колхозе qlik, tableau, business objects и даже SSAS cube.
Ведутся изыскания по построению решения на базе Kyvos OLAP.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525500
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
import org.apache.spark.sql.types.{DoubleType, StringType, StructField, StructType, IntegerType}

val schema = new StructType().add(
             StructField("position", IntegerType, true)).add(
             StructField("id", IntegerType, true)).add(
             StructField("type", StringType, true)).add(
             StructField("value", IntegerType, true)).add(
             StructField("prev_o_value", IntegerType, true))

def func(iter: Iterator[Row]) : Iterator[Row] = {
  var res = List[Row]();
  var prev_o_value = null.asInstanceOf[Integer];
  while (iter.hasNext)
  {
    iter.next match { case Row(position: Int, id: Int, xtype: String, value: Int) => 
    res = res ::: List(Row(position, id, xtype, value, if (xtype == "adjusted") (prev_o_value) else (null.asInstanceOf[Integer])));
    prev_o_value = if (xtype == "original") (value) else (prev_o_value);
    }
  }
  res.iterator
}

spark.createDataFrame(df.repartition($"position").sortWithinPartitions($"id").rdd.mapPartitions(func, true), schema).show



отличная демонстрация того как примитивная задача на несколько строк MR в спарке может превратиться в совершенно не читаемое нагромождение вермишели. посмотри, у тебя 2 месяца ушло на этот код, а теперь сколько человек из команды эту вермишель сможет прочесть ? а сколькие добавить условие 3) "число предыдущих original так чтоб их сумма не превышала заданный лимит" ?

спарк штука безусловно интересная и перспективная, но пока достаточно сырая, в клоудере так и откровенно кастрированная. книги и примеры по спарку по прежнему полный примитив. как строить что-то сложнее word count никто не знает. документации считай нет, все примерчики в книгах запускают джобы в отдельных jvm, которые естественно получают отдельные sparkSession. что бы шарить sparkSession народ воротит какие-то мутные REST сервисы аля spark-jobserver , которые выглядят вообще не сексуально, не секьюрно.
кроме этого код в том виде как у тебя, это был бы серьезный шаг назад в плане безопасности кода. в терминах оракла у тебя динамический sql, который компилятор никак не валидирует. вместо df.repartition($"position") я могу написать df.repartition($"pornosition") и компилятор не заметит косяка.

то что MR все общение между мапперами и редюсарами делает через писанину на hdfs большой и жирный минус, но есть много задач, где скорость не единственный показатель. надежность выполнения, безопасность кода и наглядность зачастую имеют не меньшее значение. а спарк пока на том уровне развития когда еще очень просто вместо солюшена получить нечитаемую и не безопасную вермишель вместо кода.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525526
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!отличная демонстрация того как примитивная задача на несколько строк MR в спарке может превратиться в совершенно не читаемое нагромождение вермишели.Ты же отличаешь уровень представления от собственно логики. То же касается и способности считать строки.
Если скала ты совсем не понимаешь, то пиши на java.
Yo.!посмотри, у тебя 2 месяца ушло на этот кодДа какое там, я эту задачу с 2014 решал.
И да, пришлось потратить больше часа на ответ тебе, это не типичный пост, который делаешь в рабочее время.
Yo.!спарк штука безусловно интересная и перспективная, но пока достаточно сырая, в клоудере так и откровенно кастрированная. книги и примеры по спарку по прежнему полный примитив. как строить что-то сложнее word count никто не знает. документации считай нет, все примерчики в книгах запускают джобы в отдельных jvm, которые естественно получают отдельные sparkSession. что бы шарить sparkSession народ воротит какие-то мутные REST сервисы аля spark-jobserver , которые выглядят вообще не сексуально, не секьюрно.Да, штука сырая, с книгами проблемы.
Зато по MR есть занимательное чтиво MapReduce Design Patterns . Для академического ознакомления самое оно.
Отсутствие примеров в доке тоже хреново, что есть то есть.
Yo.!кроме этого код в том виде как у тебя, это был бы серьезный шаг назад в плане безопасности кода. в терминах оракла у тебя динамический sql, который компилятор никак не валидирует. вместо df.repartition($"position") я могу написать df.repartition($"pornosition") и компилятор не заметит косяка.Мой код просто набросок для демонстрации разных подходов.
Там многое можно и нужно изменять начиная от минимальной привязки к типам. Если изменить тип value на double то он перестанет работать.
И заканчивая тем, что true functional developers совсем бы не оценили наличие у меня mutable var.
Yo.!то что MR все общение между мапперами и редюсарами делает через писанину на hdfs большой и жирный минус, но есть много задач, где скорость не единственный показатель. надежность выполнения, безопасность кода и наглядность зачастую имеют не меньшее значение. а спарк пока на том уровне развития когда еще очень просто вместо солюшена получить нечитаемую и не безопасную вермишель вместо кода.Если не хватает памяти, то никто не мешает persist intermediate results в HDFS. Но если честно у меня такой необходимости не возникло.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525548
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopс книгами проблемыОказывается летом вышло пару книг о которых не знал.

Scala and Spark for Big Data Analytics
High Performance Spark: Best Practices for Scaling and Optimizing Apache Spark

Если что - обе pdf легко гуглятся в открытом доступе.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525649
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopТы же отличаешь уровень представления от собственно логики. То же касается и способности считать строки.
Если скала ты совсем не понимаешь, то пиши на java.

я отличаю, потому у меня и подозрение, что теперь в такую конструкцию впихнуть оставшиеся условия пятничной задачки без большого изврата не выйдет. можно в ваш код добавить пункт 3:
3) "число предыдущих original так чтоб их сумма не превышала заданный лимит"

dbms_photoshopОказывается летом вышло пару книг о которых не знал.
Scala and Spark for Big Data Analytics
High Performance Spark: Best Practices for Scaling and Optimizing Apache Spark

да, летом полистал. в первой впервые увидел не две строчки описания yarn-client режима, а целых четыре строчки, плюс картинки. пока это самое подробное описание, какое видел. но многое так и остается за кадром. я так и не нашел внятного описания что такое driver program, что делает spark-submit и прочие, минимально необходимые для пониманий концепций вещи. пока я так и не понял что делает spark-submit, думаю он в стиле map-reduce создает для yarn временные папки с /etc/conf туда упаковывает свои джарники, мои джарники и запускает нечто типа контейнера из такой папки. но внятного описания нигде нет. как дальше код попадает на воркеры тоже нет описаний, вероятно он шлет копию моего джарника каждому воркеру. вероятно, но хотелось бы однозначного описания этих базовых вещей, пусть не в доку, пусть в книге.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525770
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!можно в ваш код добавить пункт 3:
3) "число предыдущих original так чтоб их сумма не превышала заданный лимит"Я использовал бы подход как я продемонстировал для Оракла - добавил бы переменную и вспомогательную очередь.
При случае поговорю с функциональными парнями у которых scala primary skill, как бы сделали они.
Yo.!да, летом полистал. в первой впервые увидел не две строчки описания yarn-client режима, а целых четыре строчки, плюс картинки. пока это самое подробное описание, какое видел. но многое так и остается за кадром. я так и не нашел внятного описания что такое driver program, что делает spark-submit и прочие, минимально необходимые для пониманий концепций вещи. пока я так и не понял что делает spark-submit, думаю он в стиле map-reduce создает для yarn временные папки с /etc/conf туда упаковывает свои джарники, мои джарники и запускает нечто типа контейнера из такой папки. но внятного описания нигде нет. как дальше код попадает на воркеры тоже нет описаний, вероятно он шлет копию моего джарника каждому воркеру. вероятно, но хотелось бы однозначного описания этих базовых вещей, пусть не в доку, пусть в книге.
Running Spark on YARN -> Preparations
Optimizing YARN Mode in Unmanaged CDH Deployments
?
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525836
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopЯ использовал бы подход как я продемонстировал для Оракла - добавил бы переменную и вспомогательную очередь.
При случае поговорю с функциональными парнями у которых scala primary skill, как бы сделали они.

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

dbms_photoshop Running Spark on YARN -> Preparations
Optimizing YARN Mode in Unmanaged CDH Deployments
?
свои вопросы там не прояснил: "The configuration contained in this directory will be distributed to the YARN cluster so that all containers used by the application use the same configuration." - тут речь о том, что инфо содержащееся в папках будет distributed, а каким образом нифига не сказано. с моим джарником тоже не ясно, в "Optimizing YARN Mode in Unmanaged CDH Deployments" речь как я понял про голый спарк, а не джарники с моим кодом. причем в моем случае у меня managed by Cloudera Manager вариант и как я понимаю spark-assembly.jar сама клоудера подсовывает как-то.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525837
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!,

1. Речь про этот вариант 20559260 . Там один проход и ты сам его на него даже ссылался.
2. Там речь про бинарники и спарка и прикладухи.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39525870
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop1. Речь про этот вариант 20559260 . Там один проход и ты сам его на него даже ссылался.

ок, тогда вопрос как именно этот вариант в спарке будет реализован. решение в лоб было бы датасет по "select * from t order by id" и проход по нему, но если я верно понимаю концепции спарк это плохо смаштабируется. в варианте rdd.mapPartitions(func, true) запуститься тьма воркеров которые запустят func в параллель, а в решении в лоб получиться лишь один поток, обрабатывающий данные из датасета


dbms_photoshop2. Там речь про бинарники и спарка и прикладухи.
клоудера1. Manually upload the Spark assembly JAR file to HDFS:

$ hdfs dfs -mkdir -p /user/spark/share/lib
$ hdfs dfs -put SPARK_HOME/assembly/lib/spark-assembly_*.jar /user/spark/share/lib/spark-assembly.jar

You must manually upload the JAR each time you upgrade Spark to a new minor CDH release.

manually upload the JAR each time you upgrade Spark - тут речь лишь о JARs спарка
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39526492
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopIvan Durakпропущено...

Скажите, какие отчетные системы юзают импалу?? Самописные или ентерпрайз какие-то?С этого топик начинался (только с позиции разработчика).
Всё что знает ODBC/JDBC может тянуть данные из Impala via SQL.

В моем колхозе qlik, tableau, business objects и даже SSAS cube.
Ведутся изыскания по построению решения на базе Kyvos OLAP.
ну например business objects на HIVE sql не взлетел от слова совсем. Автогенеренные зубодробительные sql от BO - не по зубам хайву.
Что-то про спарк тоже сомневаюсь
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527121
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!ок, тогда вопрос как именно этот вариант в спарке будет реализован. решение в лоб было бы датасет по "select * from t order by id" и проход по нему, но если я верно понимаю концепции спарк это плохо смаштабируется. в варианте rdd.mapPartitions(func, true) запуститься тьма воркеров которые запустят func в параллель, а в решении в лоб получиться лишь один поток, обрабатывающий данные из датасета
Вроде как repartition сделает shuffliung секций по нодам, потом sortWithinPartitions выполнит сортировку порций данных.
Вставлять "order by" в запрос не имеет при таком сценарии никакого смысла.
Более того, если присмотреться, в scala-решении нигде не используется SQL и данные читаются через spark.read, а не spark.sql как здесь 20604267 .
С другой стороны, подходы можно миксовать, как уже было сказано, но надо понимать зачем.

Функцию func которая, собственно, реализует всю логику можно переписать на функциональный манер (без переменных) примерно так.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
def func(iter: Iterator[Row]) : Iterator[Row] = {
  iter.scanLeft(Row(0, 0, "_", 0, 0))
  {
    case (x1, x2) =>
    val prev_o_value = if (x1.getString(2) == "original") (x1.getInt(3)) else (x1.getInt(4));
    Row(x2.getInt(0), x2.getInt(1), x2.getString(2), x2.getInt(3),
        if (x2.getString(2) == "adjusted") (prev_o_value) else (null.asInstanceOf[Integer]));
  }.drop(1)
}

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

Потом если хочется считать еще колонку count_o, то смотрим на код здесь ( 20559260 ) и реализуем идентичный подход c очередью, как уже тоже было сказано.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
def func(iter: Iterator[Row]) : Iterator[Row] = {
  val limit = 2000;
  var q = new Queue[Int];
  var total = 0;
  iter.scanLeft(Row(0, 0, "_", 0, 0, 0))
  {
    case (x1, x2) =>
    val prev_o_value = if (x1.getString(2) == "original") (x1.getInt(3)) else (x1.getInt(4));
    
    if (x2.getString(2) == "original") {
      q += x2.getInt(3);
      total += x2.getInt(3); 
    } else (
      while (total > limit){total -= q.dequeue;}
    );

    Row(x2.getInt(0), x2.getInt(1), x2.getString(2), x2.getInt(3),
        if (x2.getString(2) == "adjusted") (prev_o_value) else (null.asInstanceOf[Integer]),
        if (x2.getString(2) == "adjusted") (q.size) else (null.asInstanceOf[Integer]));
  }.drop(1)
}


результат
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
scala> spark.createDataFrame(df.repartition($"position").sortWithinPartitions($"id").rdd.mapPartitions(func, true), schema).show
+--------+---+--------+-----+------------+-------+
|position| id|    type|value|prev_o_value|count_o|
+--------+---+--------+-----+------------+-------+
|       1| 10|original|  100|        null|   null|
|       1| 20|original|  200|        null|   null|
|       1| 30|adjusted|  300|         200|      2|
|       1| 40|original|  400|        null|   null|
|       1| 50|adjusted|  500|         400|      3|
|       1| 60|original|  600|        null|   null|
|       1| 70|original|  700|        null|   null|
|       1| 80|adjusted|  800|         700|      5|
|       1| 90|adjusted|  900|         700|      5|
|       1|100|original| 1000|        null|   null|
|       1|110|adjusted| 1100|        1000|      2|
|       1|120|original| 1200|        null|   null|
|       1|130|adjusted| 1300|        1200|      1|
|       1|140|original| 1400|        null|   null|
|       1|150|adjusted| 1500|        1400|      1|
|      10| 10|original|  100|        null|   null|
|      10| 20|original|  200|        null|   null|
|      10| 30|adjusted|  300|         200|      2|
|      10| 40|original|  400|        null|   null|
|      10| 50|adjusted|  500|         400|      3|
+--------+---+--------+-----+------------+-------+
only showing top 20 rows


Yo.!клоудераНе желаешь пройти и по первой ссылке?
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527129
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan Durakну например business objects на HIVE sql не взлетел от слова совсем. Автогенеренные зубодробительные sql от BO - не по зубам хайву.
Что-то про спарк тоже сомневаюсьНу Hive можно переключить с ипользования MR на spark как уже было сказано 20588925 . Скорее всего это увеличит скорость в разы.

Мне big data отчасти и нравится тем, что надо понимать что ты пишешь.
Если для развитой СУБД много какие говно-запросы отработают за приемлемое время благодаря query transformations и индексам,
то это не случай для bigdata. Query transformations здесь тоже имееются, но сильно урезанные пока.

Например, если нет понимания, что для такого запроса не может быть hash join (без concatenation),
то можно винить Impala что она работает вечность.
Код: plaintext
1.
2.
select *
from t1
join t2 on t1.id = t2.col1 or t1.id = t2.col2
Hive вообще скажет
Код: plaintext
OR not supported in JOIN
и, наверное, это даже лучше.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527341
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopПодозреваю что на это ты скажешь что тоже нечитаемый спагетти код.

это же эмоди !
Код: java
1.
Row(0, 0, "_", 0, 0)



но сейчас я хочу привязаться к другому - тут же два прохода замаскировано:
Код: java
1.
    val prev_o_value = if (x1.getString(2) == "original") (x1.getInt(3)) else (x1.getInt(4));


тут явно ожидается, что уже построена четвертая колонка prev_o_value, которая береться из более ранниих заклинаний. т.е. нужно сначала выполнить все заклинания для df2
Код: java
1.
val df2 = df1.withColumn("prev_o_value", when($"type" === "adjusted", max(when($"type" === "original", $"value").otherwise(null)).over(windowSpec2))


т.е. сначала он все прочтет, отсортирует, высчислит prev_o_value, а представленный код с mapPartitions(func, true) инициирует уже второй проход.

dbms_photoshopYo.!клоудераНе желаешь пройти и по первой ссылке?
и по первой сходил, но как уже писал
Yo.!свои вопросы там не прояснил: "The configuration contained in this directory will be distributed to the YARN cluster so that all containers used by the application use the same configuration." - тут речь о том, что инфо содержащееся в папках будет distributed, а каким образом нифига не сказано.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527609
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!это же эмоди !Эмодзи было использовано чтоб подсказать скале тип результата.
Yo.!т.е. сначала он все прочтет, отсортирует, высчислит prev_o_value, а представленный код с mapPartitions(func, true) инициирует уже второй проход.Насколько я понимаю ты немного значешь PL/SQL и нет сомнений касательно того, что время выполнения в Оракле для приведенного алгоритма линейное.
Если честно вообще непонятно почему ты думаешь, что есть какие-то порблемы со сложностью алгоритма в скала.
Нет никаких двух проходов, нет никакой маскировки.
Помедитируй над тем как работает scalLeftВо втором случае идет использование x1._3, хотя на входе только две "колонки"
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
scala> val li = List((1,1),(1,2),(1,3),(1,5))
li: List[(Int, Int)] = List((1,1), (1,2), (1,3), (1,5))

scala> li.toDF.show
+---+---+
| _1| _2|
+---+---+
|  1|  1|
|  1|  2|
|  1|  3|
|  1|  5|
+---+---+


scala> val it = li.toIterator
it: Iterator[(Int, Int)] = non-empty iterator

scala> it.scanLeft((0,0))((x1,x2) => (x2._1, x1._2 + x2._2)).toArray
res1: Array[(Int, Int)] = Array((0,0), (1,1), (1,3), (1,6), (1,11))

scala> val it = li.toIterator
it: Iterator[(Int, Int)] = non-empty iterator

scala> it.scanLeft((0,0,0))((x1,x2) => (x2._1, x2._2, x1._3 + x2._2)).toArray
res2: Array[(Int, Int, Int)] = Array((0,0,0), (1,1,1), (1,2,3), (1,3,6), (1,5,11))

Только желтая строка имеет отношение к спарк. Все остальное pure scala.
Чтоб было меньше "заклинаний" имеет смысл почитать про язык немного.
Диалог опять перестает быть содержательным.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527709
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopЕсли честно вообще непонятно почему ты думаешь, что есть какие-то порблемы со сложностью алгоритма в скала.
Нет никаких двух проходов, нет никакой маскировки.

потому, что разговор идет не о скале, а о фремворке spark и его работе. не важно каким диалектом мы реализуем df2 и функцию - скалой, джавой или питоном. спарк превратит датафремы в DAG граф из RDD. df2 будет одним RDD, df с функцией будет другим RDD. это не фишка скалы, это фишка фрейворка.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527727
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!,

В решении нет df2. Это уже переходит в клоунаду. Прости если я тебя задел.
И, конечно, зря я выступал против написания дубовой логики на map reduce.
Каждый программирует в меру своих способностей.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527746
Yo.!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopВ решении нет df2. Это уже переходит в клоунаду. Прости если я тебя задел.
И, конечно, зря я выступал против написания дубовой логики на map reduce.
Каждый программирует в меру своих способностей.
прости, но в твоем говнокоде
val prev_o_value = if (x1.getString(2) == "original") (x1.getInt(3)) else (x1.getInt(4));

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

dbms_photoshop
данные
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create table t as
select 1 position, id, case when column_value = 'o' then 'original' else 'adjusted' end type, value from
(select 1 position, 10 id, 'o' column_value, 100 value
union all select 1 position, 20 id, 'o' column_value, 200 value
union all select 1 position, 30 id, 'a' column_value, 300 value
union all select 1 position, 40 id, 'o' column_value, 400 value
union all select 1 position, 50 id, 'a' column_value, 500 value
union all select 1 position, 60 id, 'o' column_value, 600 value
union all select 1 position, 70 id, 'o' column_value, 700 value
union all select 1 position, 80 id, 'a' column_value, 800 value
union all select 1 position, 90 id, 'a' column_value, 900 value
union all select 1 position, 100 id, 'o' column_value, 1000 value
union all select 1 position, 110 id, 'a' column_value, 1100 value
union all select 1 position, 120 id, 'o' column_value, 1200 value
union all select 1 position, 130 id, 'a' column_value, 1300 value
union all select 1 position, 140 id, 'o' column_value, 1400 value
union all select 1 position, 150 id, 'a' column_value, 1500 value) t



предыдущее значение у тебя вычисляет df2.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39527782
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo.!...
Жги еще. Не думал что ты в итоге окажешься так жалок.

Попробуем для самых маленьких.
Предположим что ты смог создать таблицу.
Запускаешь spark-shell.
Копируешь туда код
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
val spark = org.apache.spark.sql.SparkSession.builder().config("spark.sql.parquet.binaryAsString","true").getOrCreate()
val df = spark.read.load("hdfs://.../t")

import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{DoubleType, StringType, StructField, StructType, IntegerType}
import scala.collection.mutable.Queue

val schema = new StructType().add(
             StructField("position", IntegerType, true)).add(
             StructField("id", IntegerType, true)).add(
             StructField("type", StringType, true)).add(
             StructField("value", IntegerType, true)).add(
             StructField("prev_o_value", IntegerType, true)).add(
             StructField("count_o", IntegerType, true))

def func(iter: Iterator[Row]) : Iterator[Row] = {
  val limit = 2000;
  var q = new Queue[Int];
  var total = 0;
  iter.scanLeft(Row(0, 0, "_", 0, 0, 0))
  {
    case (x1, x2) =>
    val prev_o_value = if (x1.getString(2) == "original") (x1.getInt(3)) else (x1.getInt(4));
    
    if (x2.getString(2) == "original") {
      q += x2.getInt(3);
      total += x2.getInt(3); 
    } else (
      while (total > limit){total -= q.dequeue;}
    );

    Row(x2.getInt(0), x2.getInt(1), x2.getString(2), x2.getInt(3),
        if (x2.getString(2) == "adjusted") (prev_o_value) else (null.asInstanceOf[Integer]),
        if (x2.getString(2) == "adjusted") (q.size) else (null.asInstanceOf[Integer]));
  }.drop(1)
}

spark.createDataFrame(df.repartition($"position").sortWithinPartitions($"id").rdd.mapPartitions(func, true), schema).show

В итоге должно быть то, что уже было показано.

Только не нужно прикапываться к schema и прочему. Это для простоты, чтоб не использовать декодеры.
Хотя кому я объясняю... человеку которому мерещатся df2 и который не в состоянии сделать copy&paste.

Вместо трех точек догадаешься написать полный путь? Ну слава Богу.
Если scanLeft все-таки не для твоих мозгов, поковыряй другие подходы.

PS. Я загляну в топик через два-три месяца снова, может здесь появится кто толковый.
PPS. Даже не знаю почему тебя банили, такой приятный, эрудированный и конструктивный собеседник.
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39530538
Фотография Vyatich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЕсли скала ты совсем не понимаешь, то пиши на java.

А мне приходится на python писать. ((
...
Рейтинг: 0 / 0
Инструмент для работы с SQL движками Impala/Hive
    #39582883
мигель1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vyatich,
Что писать? Map reduce?)
...
Рейтинг: 0 / 0
22 сообщений из 97, страница 4 из 4
Форумы / NoSQL, Big Data [игнор отключен] [закрыт для гостей] / Инструмент для работы с SQL движками Impala/Hive
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]