pyspark;检查元素是否在collect_list中

时间:2018-07-24 13:08:59

标签: apache-spark pyspark apache-spark-sql

我正在处理数据帧df,例如以下数据帧:

df.show()

输出:

+----+------+
|keys|values|
+----+------+
|  aa| apple|
|  bb|orange|
|  bb|  desk|
|  bb|orange|
|  bb|  desk|
|  aa|   pen|
|  bb|pencil|
|  aa| chair|
+----+------+

我使用collect_set进行汇总,并获得一组已消除重复元素的对象(或collect_list来获得对象列表)。

df_new = df.groupby('keys').agg(collect_set(df.values).alias('collectedSet_values'))

结果数据帧如下:

df_new.show()

输出:

+----+----------------------+
|keys|collectedSet_values   |
+----+----------------------+
|bb  |[orange, pencil, desk]|
|aa  |[apple, pen, chair]   |
+----+----------------------+

我正在努力寻找一种方法来查看所生成的对象集中(在{{1}列中)是否包含特定的关键字(例如'chair')。我不想采用collectedSet_values解决方案。

请评论您的解决方案/想法。

亲切的问候。

1 个答案:

答案 0 :(得分:3)

实际上,有一个不错的功能array_contains可以为我们做到这一点。我们将其用于对象集的方式与here中的相同。要知道每组对象中是否都存在“椅子”一词,我们可以简单地执行以下操作:

df_new.withColumn('contains_chair', array_contains(df_new.collectedSet_values, 'chair')).show()

输出:

+----+----------------------+--------------+
|keys|collectedSet_values   |contains_chair|
+----+----------------------+--------------+
|bb  |[orange, pencil, desk]|false         |
|aa  |[apple, pen, chair]   |true          |
+----+----------------------+--------------+

collect_list的结果也是如此。