Pyspark:添加新列包含一列中的值与另一列中符合指定条件的另一列相对应

时间:2018-04-04 11:37:28

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

添加新列包含列中的值与另一列中符合指定条件的另一个值 例如, 原DF如下:

    +-----+-----+-----+
    |col1 |col2 |col3 |
    +-----+-----+-----+
    |    A|   17|    1|
    |    A|   16|    2|
    |    A|   18|    2|
    |    A|   30|    3|
    |    B|   35|    1|
    |    B|   34|    2|
    |    B|   36|    2|
    |    C|   20|    1|
    |    C|   30|    1|
    |    C|   43|    1|
    +-----+-----+-----+ 

对于每个col1组,我需要在col2中重复col3中与1相对应的值。如果col3中有更多值= 1,则col1中的任何组重复最小值 所需的Df如下:

    +----+----+----+----------+
    |col1|col2|col3|new_column|
    +----+----+----+----------+
    |   A|  17|   1|        17|
    |   A|  16|   2|        17|
    |   A|  18|   2|        17|
    |   A|  30|   3|        17|
    |   B|  35|   1|        35|
    |   B|  34|   2|        35|
    |   B|  36|   2|        35|
    |   C|  20|   1|        20|
    |   C|  30|   1|        20|
    |   C|  43|   1|        20|
    +----+----+----+----------+

1 个答案:

答案 0 :(得分:1)

df3=df.filter(df.col3==1)

+----+----+----+
|col1|col2|col3|
+----+----+----+
|   B|  35|   1|
|   C|  20|   1|
|   C|  30|   1|
|   C|  43|   1|
|   A|  17|   1|
+----+----+----+


df3.createOrReplaceTempView("mytable")

要获得col2的最小值,我按照此链接How to find exact median for grouped data in Spark

中接受的答案进行操作
df6=spark.sql("select col1, min(col2) as minimum from mytable group by col1 order by col1")

df6.show()
+----+-------+
|col1|minimum|
+----+-------+
|   A|     17|
|   B|     35|
|   C|     20|
+----+-------+

df_a=df.join(df6,['col1'],'leftouter')

+----+----+----+-------+
|col1|col2|col3|minimum|
+----+----+----+-------+
|   B|  35|   1|     35|
|   B|  34|   2|     35|
|   B|  36|   2|     35|
|   C|  20|   1|     20|
|   C|  30|   1|     20|
|   C|  43|   1|     20|
|   A|  17|   1|     17|
|   A|  16|   2|     17|
|   A|  18|   2|     17|
|   A|  30|   3|     17|
+----+----+----+-------+

有没有比这个解决方案更好的方法?