在存储为RDD元素的列表中查找唯一的元素集

时间:2016-06-23 17:06:31

标签: apache-spark pyspark

我的RDD all_keys存储值列表:

>> all_keys.take(3)
[['a','b','c'],
 ['a','b'],
 ['a','d','f']]

这些值中的大多数都是重复发生的,但有些列表确实具有其他列表中不存在的值。

如何从RDD中存储的所有列表中获取唯一元素列表?

2 个答案:

答案 0 :(得分:2)

您需要对您的RDD进行flatMap,以将其从字符串列表的RDD转换为字符串的RDD。然后,您可以使用distinct()方法仅返回唯一字符串。

创建数据

all_keys = [['category', 'ser_id', 'appname', 'timestamp', 'label', 'ser_token', 'appver', 'action'],
     ['category', 'ser_id', 'appname', 'timestamp', 'vale', 'label', 'ser_token', 'appver', 'action', 'type'], 
     ['category', 'ser_id', 'appname', 'timestamp', 'vale', 'label', 'ser_token', 'appver', 'type' ]]
rdd = sc.parallelize(all_keys)

定义flatMap函数

def explode(row):
    for k in row:
        yield k

Flatmap,获取不同的元素,收集

rdd.flatMap(explode).distinct().collect()

结果

  

[ '类别',    'ser_id',    '类型',    '行动',    “时间戳”,    'ser_token',    'appver',    '谷',    '标签',    '应用程序的名字']

答案 1 :(得分:-1)

如果您的意思是删除最终列表中的重复项(示例中没有重复项)

list(set(all_keys.take(3)))

如果您的意思是删除rdd中一个键的重复条目,例如'一个'使用

all_keys.distinct(lambda row:row[0])