【问题标题】:如何从包含pyspark sql中列名的列表[str]中获取最大()列值和名称?
【发布时间】:2022-01-07 16:06:36
【问题描述】:

我有以下示例代码:

lst1 = ["a", "b"]
for ls1 in lst1:
    new_lst = []
    lst2 = ["d", "e", "f"]
    for ls2 in lst2:
        new_lst.append(ls1 + ls2)
        df = (df.withColumn("final_" + ls1, greatest(*new_lst))

这是从每个循环中的列列表中获取最大值的正确方法吗?还有什么方法可以获取相应的列名吗?

示例:

输入 df =>

ad    ae    af    bd    be    bf    cd    ce    cf
--------------------------------------------------
10    11    12    13    14    15    16    17    18
19    20    21    22    23    24    25    26    27
28    29    30    31    32    33    34    35    36

预期输出 df =>

ad    ae    af    final_a    bd    be    bf    final_b
------------------------------------------------------
10    11    12    12         13    14    15    15
19    20    21    21         22    23    24    24
28    29    30    30         31    32    33    33

谢谢!

【问题讨论】:

  • 带有“df = ...”的最后一行应该在第二个(内部)循环之外但在第一个循环内,所以你应该将它向左移动四个位置

标签: sql list pyspark greatest-n-per-group sql-function


【解决方案1】:

如果您想获得具有相同前缀(如“a”、“b”、“c”)的列的最大值,那么这将起作用。

from pyspark.sql import functions as f

columns = df.columns
prefixs = set(map(lambda c: c[0], columns))

for prefix in prefixs:
    df = df.withColumn('final_' + prefix, f.array_max(f.array(*[f.col(c) for c in columns if c.startswith(prefix)])))
    
df.show()

+---+---+---+---+---+---+---+---+---+-------+-------+-------+
| ad| ae| af| bd| be| bf| cd| ce| cf|final_c|final_a|final_b|
+---+---+---+---+---+---+---+---+---+-------+-------+-------+
| 10| 11| 12| 13| 14| 15| 16| 17| 18|     18|     12|     15|
| 19| 20| 21| 22| 23| 24| 25| 26| 27|     27|     21|     24|
| 28| 29| 30| 31| 32| 33| 34| 35| 36|     36|     30|     33|
+---+---+---+---+---+---+---+---+---+-------+-------+-------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多