Pyspark合并数据帧的一个数组包含在另一个数组中

时间:2019-11-19 15:52:03

标签: python apache-spark pyspark

我什至不知道用什么最好的标题来表达问题。

我有以下数据集

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]|
+------------+

我最后希望拥有的是:

  1. 删除排列
  2. 仅保留具有包含所有其他集合的最大行的行

我可以使用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的列上应用了

我目前唯一能想到的方法是在整个行上进行可怕的迭代循环,这会杀死所有性能

1 个答案:

答案 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)