【问题标题】:Window function is not working on Pyspark sqlcontext窗口函数在 Pyspark sqlcontext 上不起作用
【发布时间】:2016-06-30 22:13:27
【问题描述】:

我有一个数据框,我想将数据汇总到 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)

现在我想执行一些聚合,即应用一些窗口函数,如下所示--

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;

我使用的是基于 Hadoop 预构建的 Apache Spark 1.6.0。

【问题讨论】:

    标签: hadoop apache-spark pyspark apache-spark-sql pyspark-sql


    【解决方案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;
    

    您需要一个支持 hive(使用 hive 构建)的 spark 版本,而不是声明 hivecontext:

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

    然后使用该上下文来执行您的窗口功能。

    在 python 中:

    # 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 也会发生相同的行为。

    【讨论】:

    • 是的。我已经看到了错误。但我遵循了以下主题。 thread 1thread 2Databricks thread.. 综上所述,窗口函数与 pyspark sqlcontext 一起正常工作。 @eliasah
    • 在某些环境中有点棘手。我知道所有这些线程。这些线程不提供 hivecontext 但它实际上是需要的,而且它们甚至不谈论集群配置。我已经向您介绍了我的做法。
    • 有没有办法在没有 HiveContext 的情况下使用 pyspark.sql.window 进入 pyspark sql 上下文?或如何在 pyspark.sql.sqlcontext 上管理这种情况?请建议@eliasah
    • 下载的默认预构建二进制文件也可以。
    • 非常感谢。现在蜂巢上下文对我来说是正确的。 @eliasah
    猜你喜欢
    • 2015-05-26
    • 2019-08-16
    • 2018-02-02
    • 2015-05-02
    • 2018-07-11
    • 2021-07-02
    • 1970-01-01
    • 2019-09-21
    • 2018-03-14
    相关资源
    最近更新 更多