0

我有一个数据框。列“名称”包含列标题,应连接哪些值。我想用 pyspark concat_ws() 来做,但没有任何效果。我必须用 concat_ws() 函数解决它,没有熊猫等。

我得到的最好的是连接标题,但不是此列中的值。我无法从函数返回列表以在 concat_ws() 中解压它

map_cols = {'a':'newA', 'b':'newB', 'c':'newC', 'd':'newD'}

@udf
def get_result(names_col):
    headers = []
    for i in names_col:
        headers.append(map_cols[i])
    return headers

df = df.withColumn('names_arr', split('names', '_')).withColumn('result', concat_ws(';', get_result(col('names_arr'))))
输入数据框:

姓名 | 新A|新B|新C|新D
--------------------------
a_b |1 | 2 | 7 |8
--------------------------
a_b_c |2 | 3 | 4 |4
--------------------------
a_b_c_d |3 | 2 |4 |4
--------------------------
c_d | 89 | 5 |3 |5
--------------------------
b_c_d | 7 |5 |6 | 5


预期的输出数据帧

姓名 | 新A|新B|新C|新D|结果
--------------------------------------
a_b |1 | 2 | 7 | 8 |1;2
--------------------------------------
a_b_c |2 | 3 | 4 |4 |2;3;4
--------------------------------------
a_b_c_d |3 | 2 |4 |4 |2;3;4;4
--------------------------------------
c_d |89 | 5 |3 |5 |3;5
--------------------------------------
b_c_d |7 |5 |6 | 5 |5;6;5
4

1 回答 1

1

我假设在您的预期输出colA中是最后两行(89 和 7)的错字

您可以迭代dataframe.columns并执行concat_ws

# Skip data prepare

#import 
import pyspark.sql.functions as f

df.show()
+-------+----+----+----+----+
|  names|newA|newB|newC|newD|
+-------+----+----+----+----+
|    a_b|   1|   2|null|null|
|  a_b_c|   2|   3|   4|null|
|a_b_c_d|   3|   2|   4|   4|
|    c_d|null|null|   3|   5|
|  b_c_d|null|   5|   6|   5|
+-------+----+----+----+----+

Filetring 列名(如果它names;分隔符的连接)

df.withColumn('result', f.concat_ws(';', *[c for c in df.columns if c!='names'])).show()
+-------+----+----+----+----+-------+
|  names|newA|newB|newC|newD| result|
+-------+----+----+----+----+-------+
|    a_b|   1|   2|null|null|    1;2|
|  a_b_c|   2|   3|   4|null|  2;3;4|
|a_b_c_d|   3|   2|   4|   4|3;2;4;4|
|    c_d|null|null|   3|   5|    3;5|
|  b_c_d|null|   5|   6|   5|  5;6;5|
+-------+----+----+----+----+-------+
于 2019-09-03T01:30:28.117 回答