2016-03-15 2 views
0

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

У меня есть pyspark SQL dataframe как ------

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) 

Теперь я хочу, чтобы выполнить некоторые например, использование некоторых оконных функций, таких как:

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

Но он дает followin g.

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.

ответ

3

ошибка вроде все сказано:

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; 

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

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

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

В питона:

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

Вы можете читать дальше о разнице между SQLContext и HiveContexthere.

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

+0

Да. Я видел ошибку. Но я следил за следующими темами. [thread 1] (http://stackoverflow.com/questions/32769328/how-to-use-window-functions-in-pyspark-using-dataframes), [thread 2] (http://stackoverflow.com/questions/33207164/spark-window-functions-rangebetween-dates) и [Databricks thread] (https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html). . Во всех вышеперечисленных функциях окна правильно работает с sqlcontext pyspark. @eliasah –

+0

В какой-то среде это сложно. Я знаю все эти темы. Эти потоки не представляют hivecontext, но на самом деле это необходимо, и они даже не говорят о конфигурациях кластера. Я представил вам то, как я это делаю. – eliasah

+0

Есть ли способ использовать pyspark.sql.window в pyspark sql context без HiveContext? или Как я могу управлять этим типом ситуации на pyspark.sql.sqlcontext? Пожалуйста, предложите @eliasah –