Pyspark Spark聚合/分组,以确定新列';s值基于集合中的列值

Pyspark Spark聚合/分组,以确定新列';s值基于集合中的列值,pyspark,apache-spark-sql,Pyspark,Apache Spark Sql,我有一些数据将按id分组 id, field 0 A 0 B 0 C 1 B 1 B 1 C 2 E 我想按ID分组,并计算一个简单的新值,is_special,即按ID分组,如果有(字段)在一个特殊集合{a,E}(只是一组随机字母,没有模式) 有点像Pypark 我想了解如何在不进行实际分组的情况下进行分组,并创建一个新列: 我认为可以使用下面的一些方法来实现,但我不知道如何在时使用窗口 from F i

我有一些数据将按id分组

id, field
0       A
0       B
0       C

1       B
1       B
1       C

2       E
  • 我想按ID分组,并计算一个简单的新值,
    is_special
    ,即
    按ID分组,如果有(字段)在一个特殊集合{a,E}
    (只是一组随机字母,没有模式)
  • 有点像Pypark

  • 我想了解如何在不进行实际分组的情况下进行分组,并创建一个新列:
  • 我认为可以使用下面的一些方法来实现,但我不知道如何在
    时使用
    窗口

    from F import when, col, coalesce
    
    special = ['A', 'E']
    window = Window.partitionBy('product_ari')
    
    df.withColumn("is_special", 
        when(col("field").isin(special), lit(True))
    )
    
    测试集创建:

    a=[
    (0,“A”),
    (0,“B”),
    (0,“C”),
    (1,“B”),
    (1,“B”),
    (1,“C”),
    (2,“E”),
    ]
    b=[“id”,“字段”]
    df=spark.createDataFrame(a,b)
    集合=(“A”、“E”)
    
    有几种方法可以做到这一点

  • 加入
  • 
    从pyspark.sql导入函数为F
    agg_df=(
    df.withColumn(
    “is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
    )
    .groupBy(“id”)
    .agg(F.max(“特殊”)。别名(“特殊”))
    )
    加入(agg_-df,on=“id”,how=“left”).show()
    +---+-----+----------+
    |id |字段|是特殊的|
    +---+-----+----------+
    |0 | A |正确|
    |0 | B |正确|
    |0 | C |正确|
    |1 | B |假|
    |1 | B |假|
    |1 | C |假|
    |2 | E |正确|
    +---+-----+----------+
    
  • 有窗户
  • 从pyspark.sql导入窗口
    df.withColumn(
    “is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
    ).withColumn(“is_special”,F.max(“is_special”).over(Window.partitionBy(“id”)).show()
    #或“一行”
    df.withColumn(
    “是特别的”,
    F.max(F.when(F.expr(F“fieldin{set_}”),True。否则(False))。结束(
    窗口分割人(“id”)
    ),
    ).show()
    +---+-----+----------+
    |id |字段|是特殊的|
    +---+-----+----------+
    |0 | A |正确|
    |0 | B |正确|
    |0 | C |正确|
    |1 | B |假|
    |1 | B |假|
    |1 | C |假|
    |2 | E |正确|
    +---+-----+----------+
    
    测试集创建:

    a=[
    (0,“A”),
    (0,“B”),
    (0,“C”),
    (1,“B”),
    (1,“B”),
    (1,“C”),
    (2,“E”),
    ]
    b=[“id”,“字段”]
    df=spark.createDataFrame(a,b)
    集合=(“A”、“E”)
    
    有几种方法可以做到这一点

  • 加入
  • 
    从pyspark.sql导入函数为F
    agg_df=(
    df.withColumn(
    “is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
    )
    .groupBy(“id”)
    .agg(F.max(“特殊”)。别名(“特殊”))
    )
    加入(agg_-df,on=“id”,how=“left”).show()
    +---+-----+----------+
    |id |字段|是特殊的|
    +---+-----+----------+
    |0 | A |正确|
    |0 | B |正确|
    |0 | C |正确|
    |1 | B |假|
    |1 | B |假|
    |1 | C |假|
    |2 | E |正确|
    +---+-----+----------+
    
  • 有窗户
  • 从pyspark.sql导入窗口
    df.withColumn(
    “is_special”,F.when(F.expr(F“fieldin{set_}”),True)。否则(False)
    ).withColumn(“is_special”,F.max(“is_special”).over(Window.partitionBy(“id”)).show()
    #或“一行”
    df.withColumn(
    “是特别的”,
    F.max(F.when(F.expr(F“fieldin{set_}”),True。否则(False))。结束(
    窗口分割人(“id”)
    ),
    ).show()
    +---+-----+----------+
    |id |字段|是特殊的|
    +---+-----+----------+
    |0 | A |正确|
    |0 | B |正确|
    |0 | C |正确|
    |1 | B |假|
    |1 | B |假|
    |1 | C |假|
    |2 | E |正确|
    +---+-----+----------+
    
    为了获得一点知识,还需要进行以下工作:

    从pyspark.sql.functions导入(
    数组_相交,
    大小,
    数组_除了,
    收集集合,
    点燃,
    阵列,
    爆炸,,
    )
    df=sc.parallelize(
    [
    (0,“A”),
    (0,“B”),
    (0,“C”),
    (1,“B”),
    (1,“B”),
    (1,“C”),
    (2,“A”),
    (2,“E”),
    (2,“A”),
    (2,“A”),
    (2,“G”),
    (2,“J”),
    (3,“A”),
    (4,“E”),
    (5,“A”),
    (5,“E”),
    (6,“Z”),
    ]
    ).toDF([“id”,“字段”])
    df2=df.groupby(“id”).agg(collect_set(“field”).alias(“X”))
    df3a=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)),lit(“A”;))>=1)
    df3b=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)、lit(“A”;))==0)
    df4=(
    df3a.select(df3a.id,explode(df3a.X).alias(“字段”))
    .withColumn(“是特别的”,亮起(真实))
    .工会(
    df3b.select(df3b.id,explode(df3b.X).alias(“字段”)).withColumn(
    “是否特别”,亮起(假)
    )
    )
    )
    df4.show()
    
    返回:

    +---+-----+----------+
    | id|field|is_special|
    +---+-----+----------+
    |  0|    C|      true|
    |  0|    B|      true|
    |  0|    A|      true|
    |  5|    E|      true|
    |  5|    A|      true|
    |  3|    A|      true|
    |  2|    J|      true|
    |  2|    E|      true|
    |  2|    G|      true|
    |  2|    A|      true|
    |  4|    E|      true|
    |  6|    Z|     false|
    |  1|    C|     false|
    |  1|    B|     false|
    +---+-----+----------+
    

    对于一点知识分子来说,还可以进行以下工作:

    从pyspark.sql.functions导入(
    数组_相交,
    大小,
    数组_除了,
    收集集合,
    点燃,
    阵列,
    爆炸,,
    )
    df=sc.parallelize(
    [
    (0,“A”),
    (0,“B”),
    (0,“C”),
    (1,“B”),
    (1,“B”),
    (1,“C”),
    (2,“A”),
    (2,“E”),
    (2,“A”),
    (2,“A”),
    (2,“G”),
    (2,“J”),
    (3,“A”),
    (4,“E”),
    (5,“A”),
    (5,“E”),
    (6,“Z”),
    ]
    ).toDF([“id”,“字段”])
    df2=df.groupby(“id”).agg(collect_set(“field”).alias(“X”))
    df3a=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)),lit(“A”;))>=1)
    df3b=df2.过滤器(大小(数组_相交(df2[“X”]),lit(数组(lit(“E”)、lit(“A”;))==0)
    df4=(
    df3a.select(df3a.id,explode(df3a.X).alias(“字段”))
    .withColumn(“是特别的”,亮起(真实))
    .工会(
    df3b.select(df3b.id,explode(df3b.X).alias(“字段”)).withColumn(
    “是否特别”,亮起(假)
    )
    )
    )
    df4.show()
    
    返回:

    +---+-----+----------+
    | id|field|is_special|
    +---+-----+----------+
    |  0|    C|      true|
    |  0|    B|      true|
    |  0|    A|      true|
    |  5|    E|      true|
    |  5|    A|      true|
    |  3|    A|      true|
    |  2|    J|      true|
    |  2|    E|      true|
    |  2|    G|      true|
    |  2|    A|      true|
    |  4|    E|      true|
    |  6|    Z|     false|
    |  1|    C|     false|
    |  1|    B|     false|
    +---+-----+----------+
    

    为什么要关窗户?那问题是什么?好问题我得说为什么要关窗户?那问题是什么?好问题我必须问say@Steven也许你能欣赏answ
    +---+-----+----------+
    | id|field|is_special|
    +---+-----+----------+
    |  0|    C|      true|
    |  0|    B|      true|
    |  0|    A|      true|
    |  5|    E|      true|
    |  5|    A|      true|
    |  3|    A|      true|
    |  2|    J|      true|
    |  2|    E|      true|
    |  2|    G|      true|
    |  2|    A|      true|
    |  4|    E|      true|
    |  6|    Z|     false|
    |  1|    C|     false|
    |  1|    B|     false|
    +---+-----+----------+