Select 使用pyspark收集集合后,在集合中按值选择行

Select 使用pyspark收集集合后,在集合中按值选择行,select,pyspark,row,Select,Pyspark,Row,使用 方法f.agg和f.collect_set I在数据帧中创建了列colSet,如下所示: from pyspark.sql import functions as f 现在,如何使用python/和pyspark只选择那些行,例如,3是colSet条目中数组的一个元素(通常可以有远不止两个条目!) 我尝试过使用如下udf函数: +-------+--------+ | index | colSet | +-------+--------+ | 1|[11, 13]| |

使用

方法f.agg和f.collect_set I在数据帧中创建了列colSet,如下所示:

from pyspark.sql import functions as f
现在,如何使用python/和pyspark只选择那些行,例如,3是colSet条目中数组的一个元素(通常可以有远不止两个条目!)

我尝试过使用如下udf函数:

+-------+--------+
| index | colSet |
+-------+--------+
|      1|[11, 13]|
|      2|  [3, 6]|
|      3|  [3, 7]|
|      4|  [2, 7]|
|      5|  [2, 6]|
+-------+--------+
通过

isInSet = f.udf( lambda vcol, val: val in vcol, BooleanType())
我还尝试从调用者中删除f.col,并在isInSet的定义中使用它,但两者都不起作用,我遇到了一个异常:

dataFrame.where(isInSet(f.col('colSet'), 3))
对于如何选择具有特定条目的行(或更好的子集!!!)以及给定具有收集集结果的行,我们非常感谢您提供的任何帮助。

我今天(在周五晚上失败后)找到了一个解决方案,无需使用udf方法:

AnalysisException: cannot resolve '3' given input columns: [index, colSet]

希望这对以后的其他人有所帮助。

您原来的自定义项很好,但要使用它,您需要将值3作为文本传递:

[3 in x[0] for x in list(dataFrame.select(['colSet']).collect())]
但正如jxc在评论中指出的,使用
array\u contains
可能是更好的选择:

dataFrame.where(isInSet(f.col('colSet'), f.lit(3)))

我没有做过任何基准测试,但一般来说,在PySpark中使用UDF比使用内置函数慢,因为JVM和Python解释器之间来回通信。

这不是一个可伸缩的解决方案,因为
collect()
将整个列拉入驱动程序节点上的本地内存。是的,它占用了大量的内存。我同时接受了阿贝博帕雷博普的回答!使用
where(f.array_contains('colSet',3))
谢谢,非常好用!我真诚地考虑使用explode,但是对于2到3个以上的条目,这不是一个选项!
dataFrame.where(f.array_contains(f.col('colSet'), 3))