我什至不知道用什么最好的标题来表达问题。
我有以下数据集
df = spark.createDataFrame([\
(["1", "2","3","4"], ),\
(["1","2","3"], ),\
(["2","1","3"], ),\
(["2","3","4","1"], ),\
(["6","7"], )\
], ['cycle', ])
df.show()
+------------+
| cycle|
+------------+
|[1, 2, 3, 4]|
| [1, 2, 3]|
| [2, 1, 3]|
|[2, 3, 4, 1]|
| [6, 7]|
+------------+
我最后希望拥有的是:
我可以使用sort_array()
和distinct()
摆脱排列
df.select(f.sort_array("cycle").alias("cycle")).distinct().show()
+------------+
| cycle|
+------------+
|[1, 2, 3, 4]|
| [6, 7]|
| [1, 2, 3]|
+------------+
我想用Pyspark减少数据集的是:
+------------+
| cycle|
+------------+
|[1, 2, 3, 4]|
| [6, 7]|
+------------+
因此请以某种方式检查[1, 2, 3]
是[1, 2, 3, 4]
的一部分,并且仅保留
因此,Python子集命令A.issubset(B)
在Pyspark,Spark的列上应用了
我目前唯一能想到的方法是在整个行上进行可怕的迭代循环,这会杀死所有性能
答案 0 :(得分:1)
您可以尝试的一种方法是,首先使用 self加入来找到所有至少具有一个超集(不包括self)的cycle
个{ {1}}满足以下条件:
d2.cycle
array_except size(
: d2.cycle 中没有任何项目被排除在 d1.cycle 中(EMPTY数组将满足)(d2.cycle, d1.cycle))==0
: d2.cycle 的 size 小于 d1.cycle 的 size em>:然后使用left_anti连接将上述列表从原始数据帧中排除,最后运行sort_array和drop_duplicates(或不重复):
size(d2.cycle) < size(d1.cycle)