重新排序列值pyspark

时间:2017-04-05 09:06:34

标签: pyspark spark-dataframe

当我在PySpark中对if (Regex.IsMatch(_UID, "[]/[#*._]")) return ErrorMessage;执行Select操作时,它会缩减为以下内容:

DataFrame

我要求+-----+--------+-------+ | val | Feat1 | Feat2 | +-----+--------+-------+ | 1 | f1a | f2a | | 2 | f1a | f2b | | 8 | f1b | f2f | | 9 | f1a | f2d | | 4 | f1b | f2c | | 6 | f1b | f2a | | 1 | f1c | f2c | | 3 | f1c | f2g | | 9 | f1c | f2e | +-----+--------+-------+ 列根据另一个字段val进行分组排序,如下所示:

Feat1

请注意+-----+--------+-------+ | val | Feat1 | Feat2 | +-----+--------+-------+ | 1 | f1a | f2a | | 2 | f1a | f2b | | 3 | f1a | f2d | | 1 | f1b | f2c | | 2 | f1b | f2a | | 3 | f1b | f2f | | 1 | f1c | f2c | | 2 | f1c | f2g | | 3 | f1c | f2e | +-----+--------+-------+ 值不依赖于val的顺序,而是根据其原始Feat2值进行排序。

是否有命令根据需要对PySpark中的列值重新排序。

注意Question存在相同但特定于SQL-lite。

1 个答案:

答案 0 :(得分:2)

data = [(1, 'f1a', 'f2a'),
 (2, 'f1a', 'f2b'),
 (8, 'f1b', 'f2f'),
 (9, 'f1a', 'f2d'),
 (4, 'f1b', 'f2c'),
 (6, 'f1b', 'f2a'),
 (1, 'f1c', 'f2c'),
 (3, 'f1c', 'f2g'),
 (9, 'f1c', 'f2e')]              

table = sqlContext.createDataFrame(data, ['val', 'Feat1', 'Feat2'])

编辑:为此,您可以使用具有等级功能的窗口:

from pyspark.sql import Window
from pyspark.sql.functions import rank

w = Window.partitionBy('Feat1').orderBy('val')

table.withColumn('val', rank().over(w)).orderBy('Feat1').show()
+---+-----+-----+
|val|Feat1|Feat2|
+---+-----+-----+
|  1|  f1a|  f2a|
|  2|  f1a|  f2b|
|  3|  f1a|  f2d|
|  1|  f1b|  f2c|
|  2|  f1b|  f2a|
|  3|  f1b|  f2f|
|  1|  f1c|  f2c|
|  2|  f1c|  f2g|
|  3|  f1c|  f2e|
+---+-----+-----+