【发布时间】:2020-09-07 08:36:35
【问题描述】:
我有一个 PySpark 数据框,它有一个字符串列,其中包含一个逗号分隔、未排序的值列表(最多 5 个值),如下所示:
+----+----------------------+
|col1|col2 |
+----+----------------------+
|1 | 'b1, a1, c1' |
|2 | 'a2, b2' |
|3 | 'e3, d3, a3, c3, b3' |
+----+----------------------+
我想对col2 进行标记,然后根据标准对它们进行排名,并从col2 中创建 5 个新的不同列,如果标记化返回的值少于 5 个,则可能具有空值。排序很简单:如果token在set1中,则放入第一个新列(col3),否则,如果在set2中,则放入第二个新列(col4),以此类推。
假设:
set1 = ['a1', 'a2', 'a3', 'a4', 'a5'],
set2 = ['b1', 'b2', 'b3', 'b4', 'b5'],
set3 = ['c1', 'c2', 'c3', 'c4', 'c5'],
set4 = ['d1', 'd2', 'd3', 'd4', 'd5'],
set5 = ['e1', 'e2', 'e3', 'e4', 'e5']
然后对上面的数据框应用更改将产生以下数据框:
+----+----+----+----+----+----+
|col1|col3|col4|col5|col6|col7|
+----+----+----+----+----+----+
|1 |'a1'|'b1'|'c1'|null|null|
|2 |'a2'|'b2'|null|null|null|
|3 |'a3'|'b3'|'c3'|'d3'|'e3'|
+----+----+----+----+----+----+
我知道如何进行标记化:
df.withColumn('col2', split('col2', ', ')) \
.select(col('col1'), *[col('col2')[i].alias('col' + str(i + 3)) for i in range(0, 5)]) \
.show()
但在创建新列之前无法弄清楚如何执行排名。任何帮助将不胜感激。
【问题讨论】:
-
否,每个条目中的每个集合都会有一个样本,并且集合没有交集。