Оконная функция не работает в Pyspark sqlcontext

У меня есть фрейм данных, и я хочу свернуть данные за 7 дней и выполнить некоторую агрегацию по некоторым функциям.

У меня есть фреймворк pyspark sql, например ------

Sale_Date|P_1|P_2|P_3|G_1|G_2|G_3|Total_Sale|Sale_Amt|Promo_Disc_Amt  |

|2013-04-10| 1| 9| 1| 1| 1| 1| 1| 295.0|0.0|
|2013-04-11| 1| 9| 1| 1| 1| 1| 3| 567.0|0.0| 
|2013-04-12| 1| 9| 1| 1| 1| 1| 2| 500.0|200.0|   
|2013-04-13| 1| 9| 1| 1| 1| 1| 1| 245.0|20.0| 
|2013-04-14| 1| 9| 1| 1| 1| 1| 1| 245.0|0.0|
|2013-04-15| 1| 9| 1| 1| 1| 1| 2| 500.0|200.0|  
|2013-04-16| 1| 9| 1| 1| 1| 1| 1| 250.0|0.0|  

Я применил оконную функцию к фрейму данных следующим образом:

days = lambda i: i * 86400
windowSp = Window().partitionBy(dataframeOfquery3["P_1"],dataframeOfquery3["P_2"],dataframeOfquery3["P_3"],dataframeOfquery3["G_1"],dataframeOfquery3["G_2"],dataframeOfquery3["G_3"])\
          .orderBy(dataframeOfquery3["Sale_Date"].cast("timestamp").cast("long").desc())\
          .rangeBetween(-(days(7)), 0)

Теперь я хочу выполнить некоторую агрегацию, то есть применить некоторые функции Windows, такие как следующие:

df = dataframeOfquery3.select(min(dataframeOfquery3["Sale_Date"].over(windowSp).alias("Sale_Date")))
df.show()

Но это дает следующую ошибку.

py4j.protocol.Py4JJavaError: An error occurred while calling o138.select.
: org.apache.spark.sql.AnalysisException: Could not resolve window function 'min'. Note that, using window functions currently requires a HiveContext;

Я использую Apache Spark 1.6.0, предварительно созданный на Hadoop.


person Sayak Ghosh    schedule 15.03.2016    source источник


Ответы (1)


Ошибка вроде говорит обо всем:

py4j.protocol.Py4JJavaError: An error occurred while calling o138.select.
: org.apache.spark.sql.AnalysisException: Could not resolve window function 'min'. Note that, using window functions currently requires a HiveContext;

Вам понадобится версия Spark, поддерживающая улей (сборка с ульем), чем вы можете объявить контекст улья:

val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

а затем используйте этот контекст для выполнения вашей оконной функции.

В Python:

# sc is an existing SparkContext.
from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)

Подробнее о разнице между SQLContext и HiveContext здесь.

SparkSQL имеет SQLContext и HiveContext. HiveContext - это супернабор SQLContext. Сообщество Spark предлагает использовать HiveContext. Вы можете видеть, что когда вы запускаете spark-shell, приложение интерактивного драйвера, оно автоматически создает SparkContext, определенный как sc, и HiveContext, определенный как sqlContext. HiveContext позволяет выполнять SQL-запросы, а также команды Hive. То же самое происходит и с pyspark.

person eliasah    schedule 15.03.2016
comment
да. Я видел ошибку. Но я следил за следующими темами. поток 1, thread 2 и Тема Databricks .. Во всем вышеперечисленном оконная функция правильно работает с pyspark sqlcontext. @eliasah - person Sayak Ghosh; 15.03.2016
comment
Это сложно в какой-то среде. Я знаю все эти темы. Эти потоки не представляют контекст улья, но он действительно необходим, а также они даже не говорят о конфигурациях кластера. Я представил вам то, как я это делаю. - person eliasah; 15.03.2016
comment
Есть ли способ использовать pyspark.sql.window в контексте pyspark sql без HiveContext? или Как я могу справиться с подобной ситуацией в pyspark.sql.sqlcontext? Пожалуйста, предложите @eliasah - person Sayak Ghosh; 15.03.2016
comment
@SayakGhosh Это работает, потому что по умолчанию мы используем экземпляр HiveContext как SQLContext. И нет, вы не можете использовать оконные функции вне HiveContext. Почему вы хотите этого избежать? В PySpark это не добавляет к вашим зависимостям. - person zero323; 15.03.2016
comment
Вы не можете справиться с этой ситуацией только с помощью обычного sqlcontext, hivecontext, к сожалению, необходим. - person eliasah; 15.03.2016
comment
Да, я был в значительной степени сбит с толку после того, как последовал за ними ... Поскольку я новичок в этой среде, мне есть что знать. Не могли бы вы сказать мне, есть ли большая разница между SQLContext и HiveContext в создании текстового файла для чтения или в создании Dataframe? @eliasah - person Sayak Ghosh; 15.03.2016
comment
Я отредактировал свой ответ. Надеюсь, он ответит на ваш вопрос. - person eliasah; 15.03.2016
comment
На самом деле я не избегаю HiveContext, но я начал создавать свое приложение на обычном SQLContext, не зная этой разницы. Вот почему. @ zero323 - person Sayak Ghosh; 15.03.2016
comment
Если вы используете обычный SQLContext, вы не можете использовать запросы куста, такие как оконные функции. - person eliasah; 15.03.2016
comment
Большое спасибо @eliasah за ваше руководство. Не могли бы вы предложить ссылку на репозиторий, откуда я могу получить Apache Spark 1.6.0 со встроенным Hive Pre? - person Sayak Ghosh; 15.03.2016
comment
Вам нужно будет собрать его из исходников. spark.apache.org/ docs / latest / - person eliasah; 15.03.2016
comment
Стандартные предварительно созданные двоичные файлы из загрузок также работают. - person zero323; 15.03.2016
comment
Спасибо @eliasah .. Если у меня возникнут проблемы при установке, я дам вам знать. Пожалуйста, помогите, когда это необходимо. - person Sayak Ghosh; 15.03.2016
comment
@ zero323 Спасибо и за ваше предложение. Я буду очень полезен, если вы предложите мне несколько ссылок, откуда я могу получить предварительно созданные двоичные файлы по умолчанию для последней версии Spark? - person Sayak Ghosh; 15.03.2016
comment
Я хочу кое-чем поделиться. Я загрузил дистрибутив Spark с здесь @eliash .. Правильно ли распространение использовать HiveContext? - person Sayak Ghosh; 15.03.2016
comment
обычно да! но если ошибка не исчезнет, ​​вам необходимо загрузить исходный код и скомпилировать Spark. вы можете найти подробности в документации по искрам - person eliasah; 15.03.2016
comment
После распаковки я использовал sbt/sbt assembly, чтобы собрать искру. Это правильная команда для этого? Или мне нужно использовать sbt/sbt -phive assembly, чтобы создать искру для использования контекста Hive в качестве контекста Sql? @eliasah предложите пожалуйста - person Sayak Ghosh; 16.03.2016
comment
вот вам: spark.apache.org/docs/ latest / ps: документация по искрам идеальна. Вы всегда можете найти там то, что ищете. Считайте это библией искры! - person eliasah; 16.03.2016
comment
Большое спасибо. Теперь у меня корректно работает контекст улья. @eliasah - person Sayak Ghosh; 17.03.2016
comment
@eliasah Я прошел через поток. У меня тоже похожая ситуация. Но моя Sale_Date не накапливалась. Пожалуйста, предлагаете. - person Sayak Ghosh; 17.03.2016
comment
Я не понимаю вашего вопроса @SayakGhosh - person eliasah; 17.03.2016
comment
Не делай этого! Задайте новый вопрос! @SayakGhosh - person eliasah; 17.03.2016