2016-03-15 69 views
0

我有一個數據框,我想把數據彙總到7天,並對一些函數做一些聚合。窗口函數不能在Pyspark上工作sqlcontext

我有一個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) 

現在我想執行一些聚合,即應用一些窗口功能,如下所示 -

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) 

可以約SQLContextHiveContexthere之間的差異進一步閱讀。

SparkSQL有一個SQLContext和一個HiveContext。 HiveContext是SQLContext的超集。 Spark社區建議使用HiveContext。您可以看到,當您運行spark-shell(它是交互式驅動程序應用程序)時,它會自動創建一個定義爲sc的SparkContext和一個定義爲sqlContext的HiveContext。 HiveContext允許您執行SQL查詢以及Hive命令。 pyspark也會發生同樣的情況。

+0

是的。我看到了錯誤。但我遵循以下線程。 [線程1](http://stackoverflow.com/questions/32769328/how-to-use-window-functions-in-pyspark-using-dataframes),[線程2](http://stackoverflow.com/questions/33207164/spark-window-functions-rangesbetween-dates)和[Databricks線程](https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html)。在上述所有的窗口函數中,正確地使用了pyspark sqlcontext。 @eliasah –

+0

在某種環境下這有點棘手。我知道所有這些線程。這些線程不提供hivecontext,但它實際上是需要的,他們甚至不談論集羣配置。我已經給你提供了我這樣做的方式。 – eliasah

+0

有沒有辦法使用pyspark.sql.window到沒有HiveContext的pyspark sql上下文?或者我如何在pyspark.sql.sqlcontext上管理這種類型的情況?請建議@eliasah –