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

阿帕奇火花按DF分组,将值收集到列表中,然后按列表分组

皮自明
2023-03-14

我有以下Apache Spark数据帧(DF1):

function_name | param1 | param2 | param3 | result
---------------------------------------------------
     f1       |   a    |   b    |   c    |   1        
     f1       |   b    |   d    |   m    |   0
     f2       |   a    |   b    |   c    |   0
     f2       |   b    |   d    |   m    |   0
     f3       |   a    |   b    |   c    |   1
     f3       |   b    |   d    |   m    |   1
     f4       |   a    |   b    |   c    |   0
     f4       |   b    |   d    |   m    |   0

首先,我想按function_name对DataFrame进行分组,将结果收集到ArrayType中并接收新的DataFrame(DF2):

function_name | result_list
--------------------------------
     f1       |  [1,0]
     f2       |  [0,0]
     f3       |  [1,1]
     f4       |  [0,0]

之后,我需要收集function_nameArrayType通过分组result_list,我将收到如下所示的新DataFrame(DF3):

result_list |  function_name_lists
------------------------------------
    [1,0]   |   [f1]
    [0,0]   |   [f2,f4]
    [1,1]   |   [f3]

所以,我有一个问题 - 首先,我可以在阿帕奇火花中使用按数组类型列分组吗?如果是这样,我可能会在 ArrayType 单个字段中result_list数千万个值。在这种情况下,阿帕奇火花是否能够按result_list列进行分组?

共有1个答案

诸葛雨泽
2023-03-14

是的,你能做到。

from pyspark.sql.window import Window
from pyspark.sql import functions as F
from pyspark.sql.types import *
list=[['f1','a','b','c',1],
     ['f1','b','d','m',0],
     ['f2','a','b','c',0],
     ['f2','b','d','m',0],
     ['f3','a','b','c',1],
     ['f3','b','d','m',1],
     ['f4','a','b','c',0],
      ['f4','b','d','m',0]]

df= spark.createDataFrame(list,['function_name','param1','param2','param3','result'])
df.show()

+-------------+------+------+------+------+
|function_name|param1|param2|param3|result|
+-------------+------+------+------+------+
|           f1|     a|     b|     c|     1|
|           f1|     b|     d|     m|     0|
|           f2|     a|     b|     c|     0|
|           f2|     b|     d|     m|     0|
|           f3|     a|     b|     c|     1|
|           f3|     b|     d|     m|     1|
|           f4|     a|     b|     c|     0|
|           f4|     b|     d|     m|     0|
+-------------+------+------+------+------+
w=Window().partitionBy("function_name").orderBy(F.col("param1"),F.col("param2"),F.col("param3"))
w1=Window().partitionBy("function_name")
df1=df.withColumn("result_list", F.collect_list("result").over(w)).withColumn("result2",F.row_number().over(w))\
.withColumn("result3",F.max("result2").over(w1))\
.filter(F.col("result2")==F.col("result3")).drop("param1","param2","param3","result","result2","result3")


df1.groupBy("result_list")\
.agg(F.collect_list("function_name").alias("function_name_list")).show()

    +-----------+------------------+
    |result_list|function_name_list|
    +-----------+------------------+
    |     [1, 0]|              [f1]|
    |     [1, 1]|              [f3]|
    |     [0, 0]|          [f2, f4]|
    +-----------+------------------+

为了对数组类型列进行进一步的分析、转换或清理,我建议您查看斯派克2.4及更高版本中的新高阶函数。

(collect_list适用于spark1.6及以上版本)

开源中的高阶函数:

https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.collect_list

https://spark . Apache . org/docs/latest/API/python/py spark . SQL . html # py spark . SQL . functions . array _ contains起

Databricks发布:链接:https://docs.databricks.com/delta/data-transformation/higher-order-lambda-functions.html

 类似资料:
  • 问题内容: 假设我有一个这样的列表: 我如何最优雅地将其分组以在Python中获得此列表输出: 因此,这些值按次值分组,但顺序保留下来。 问题答案:

  • 我有一个包含多列的数据框架: 我现在想将组合成一列。但是,我不知道列列表会有多大,否则我可以使用UDF3来组合这三个。 所以期望的结果是: 我怎样才能实现这一点? 不工作的伪代码: 最坏的解决方法是对输入列的数量执行switch语句,然后为每个输入列编写一个UDF,即2-20个输入列,如果提供了更多的输入列,则抛出一个错误。

  • 问题内容: 给定这样的假设查询: 并有一个类似于下面的表格: 所需结果: 有什么方法可以使用GROUP BY和LIKE语句(LIKE“ silver”,LIKE“ gold”,LIKE“ platinum”等)对这些条目进行分组? 问题答案: 您可以使用: 某些数据库允许您在中使用列别名。

  • 我肯定这是一个愚蠢的问题,但我找不到一个简单的方法将一个列表按另一个列表分组。我在网上搜索了很多,但我只找到了带有类属性或排序元素的示例。 我有一个带有键的字符串列表,例如: 和一个我想按键列表分组的int列表,例如: 因此结果应该是一个包含子列表的列表,如下所示: 或者也可以得到指数。提前道谢。

  • 我有一个String变量,其中包含几个用逗号分隔的列名。例如: val temp = "第二列,第三列,第四列" 我有一个Dataframe,我想根据某些列对Dataframe进行分组,其中包括存储在temp变量中的列。例如,我的groupBy语句应该像下面的语句 DF.groupBy(“Col1”、“Col2”、“Col3”、“Col4”) temp变量可以有任何列名。因此,我想创建一个Grou

  • 我需要使用特定对象的属性(