当前位置: 首页 > 知识库问答 >
问题:

Apache Scala/Python Spark 2.4.4:按年份范围分组数据以生成/分析新特性

赵镜
2023-03-14

下面是我为特性工程生成的数据框架,现在为了驱动另一个特性,我试图创建PurchaseErrange列,其中我希望创建一个具有3年范围的列,并通过Itemno、modelnumber和valueClass列聚合ModelRatio、PurchaseRatio值。

例如:对于项目编号7010032,我们将在新的PurchaseErrange列和ModelRatio、PurchaseRatio列中有一个具有1995-1996-1997值的行,这些年的PurchaseRatio值将在相应的行中汇总。接下来,我将在接下来的3年中也这样做,即1996-1997-1998,1997-1998-1999等。

此外,该项目有一行itemclass-rgr,对于该行,我们将只有具有1996年数据的该行。

基本上,在dataframe中检查3年的数据,如果存在,则对3年范围窗口进行modelratio、purchaseratio求和。如果三年的数据不存在,那么根据数据可用性对两年或一年进行求和。

    null
| itemNo|modelnumber|itemClass |purchaseYear|          ModelRatio|      PurchaseRatio|
+-------+-----------+----------+------------+--------------------+-------------------+
|1321457|  A99AA25CA|       ATV|        1995|   1.801325096248545|                2.0|
|7010032|  A99AA25CB|       ATV|        1995|  1.0048348106365834|                2.0|
|7010032|  A99AA25CB|       ATV|        1996|  0.8899632912525741|                2.0|
|7010032|  A99AA25CB|       RGR|        1996|  0.7899632912525741|                1.0| 
|7010032|  A99AA25CB|       ATV|        1997|   1.669710806697108|                2.0|  
|7010032|  A99AA25CB|       ATV|        1998|  0.9982988629241651|                2.0| 
|7010032|  A99AA25CB|       ATV|        1999|0.006535947712418301|                1.0|
|7552901|  A99AA25CD|       ATV|        1995|   37.83901871250784|               12.0| 
|7552901|  A99AA25CD|       ATV|        1996|0.026143790849673203|                1.0|
|7552901|  A99AA25CD|       ATV|        1997|  0.9375951293759512|                2.0|

我是scala spark的新手,使用.createorReplaceTempView(“test”)尝试了它,然后应用SQL操作,但是这种方式非常复杂。你能分享一下我如何完成这件事吗?请随时用Python和或Scala提出解决方案。

共有1个答案

酆意智
2023-03-14

IIUC,您可以使用Spark SQL窗口函数如下所示:(确保purchaseYear是一个数字列或时间戳列)

编辑:根据注释,添加了all_puchase_years以包括3年序列。请注意,order BY itemNo,purchaseyear子句仅用于演示目的。

spark.sql(""" 
       SELECT itemNo 
       ,      modelnumber 
       ,      itemClass 
       ,      concat_ws('-', sort_array(collect_set(purchaseYear) OVER w1)) AS purchase_years 
       ,      concat_ws('-', sequence(purchaseYear, purchaseYear+2)) AS all_purchase_years
       ,      sum(PurchaseRatio) OVER w1 AS sum_PurchaseRatio 
       ,      sum(ModelRatio) OVER w1 AS sum_ModelRatio 
       FROM test 
       ORDER BY itemNo, purchaseYear 
       WINDOW w1 AS (
           PARTITION BY (itemNo, modelnumber, itemClass)  
           ORDER BY purchaseYear 
           RANGE BETWEEN CURRENT ROW AND 2 FOLLOWING
       ) 
""").show() 
#+-------+-----------+---------+--------------+-----------------+--------------------+
#| itemNo|modelnumber|itemClass|purchase_years|sum_PurchaseRatio|      sum_ModelRatio|
#+-------+-----------+---------+--------------+-----------------+--------------------+
#|1321457|  A99AA25CA|      ATV|          1995|              2.0|   1.801325096248545|
#|7010032|  A99AA25CB|      ATV|1995-1996-1997|              6.0|   3.564508908586266|
#|7010032|  A99AA25CB|      RGR|          1996|              1.0|  0.7899632912525741|
#|7010032|  A99AA25CB|      ATV|1996-1997-1998|              6.0|  3.5579729608738475|
#|7010032|  A99AA25CB|      ATV|1997-1998-1999|              5.0|  2.6745456173336914|
#|7010032|  A99AA25CB|      ATV|     1998-1999|              3.0|  1.0048348106365834|
#|7010032|  A99AA25CB|      ATV|          1999|              1.0|0.006535947712418301|
#|7552901|  A99AA25CD|      ATV|1995-1996-1997|             15.0|   38.80275763273346|
#|7552901|  A99AA25CD|      ATV|     1996-1997|              3.0|  0.9637389202256245|
#|7552901|  A99AA25CD|      ATV|          1997|              2.0|  0.9375951293759512|
#+-------+-----------+---------+--------------+-----------------+--------------------+
 类似资料:
  • 问题内容: 我试图查询包含年份列的表,并以逗号分隔的年份范围的字符串形式返回这些年份。年份范围将由数组中出现的连续年份确定,非连续年份/年份范围应以逗号分隔。 而不是数据类型的原因是,其中一些值包含而不是年份列表。我们可以忽略这些结果。 到目前为止,我几乎没有运气解决这个问题,因为我什至不知道从哪里开始。 有人可以给我一些指导或提供一些有用的示例来说明如何解决诸如挑战之类的问题吗? 例子 产出目标

  • 感谢所有人!

  • 问题内容: 假设有一个与此问题类似的情况。我想得到以下结果: 我可以使用选定的答案作为解决方案: 我如何确保即使在该范围内没有任何结果,也将显示30-39的分数范围? 问题答案: 尝试以下查询(也在SQL Fiddle上): 编辑: 您可以通过将参数更改为轻松调整范围。可以使用以下构造来确保始终覆盖您的分数: 对于CTE。

  • 我有以下数据框: 我需要按年和月分组数据。即:按2013年1月、2013年2月、2013年3月等分组...我将使用新分组的数据来创建一个显示每年/每月abc vs xyz的图表。 我尝试过groupby和sum的各种组合,但似乎没有任何效果。 谢谢你的帮助。

  • 问题内容: 问题答案: Mysql作为关键字的分隔符使用反引号“`”,而不是方括号(例如sql server)

  • 问题内容: 我有这样的文件: 是否可以按日期查询最近10天发布的文档数量?例如: 问题答案: 是的,您可以使用聚合轻松实现这一点,如下所示: