【问题标题】:Pyspark: Add new Column contain a value in a column counterpart another value in another column that meets a specified conditionPyspark:添加新列包含一个列对应的值在另一列中满足指定条件的另一个值
【发布时间】:2018-09-13 22:56:43
【问题描述】:

添加新列包含一个列对应的值在另一个列中满足指定条件的另一个值 例如, 原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 中 col1 中的任何组的值 =1 重复最小值 所需的 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|
    +----+----+----+----------+

【问题讨论】:

  • 您的问题假定行是按顺序排列的。 SQL 表代表 无序 集。您需要一个指定排序的列。如果不是,则 SQL 不是此操作的合适工具。
  • col1和col 3中的值是有序的

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


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

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

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 2018-09-17
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多