我已经设法在pyspark中预处理我的数据以获得类似的内容
[(u'key1', u'1'), (u'key2', u'1'), (u'key1', u'2'), (u'key3', u'2'), (u'key4', u'1'), (u'key1', u'4'), (u'key5', u'1'), (u'key6', u'2'), (u'key7', u'4'), (u'key8', u'5'), (u'key9', u'6'), (u'key10', u'7')]
现在我需要根据这些条件进行过滤:
1)过滤与至少2个键相关联的值。
输出 - 只有那些具有'1','2','4'作为值的(k,v)对应该存在,因为它们与超过2个键相关联
[(u'key1', u'1'), (u'key2', u'1'), (u'key1', u'2'), (u'key3', u'2'), (u'key4', u'1'), (u'key1', u'4'), (u'key5', u'1'), (u'key6', u'2'), (u'key2', u'4')]
2)与至少2个值相关联的过滤键
输出 - 只有那些将key1,key2作为键的(k,v)对应该存在,因为它们与至少2个值相关联
[(u'key1', u'1'), (u'key2', u'1'), (u'key1', u'2'), (u'key1', u'4'), (u'key2', u'4')]
任何建议都会有很大的帮助。
更新:我使用了groupBy和一个过滤器来对具有多个值的键进行分组
[(u'key1', [u'1', u'2', u'4']), (u'key2',[u'1', u'4'])]
现在如何将此(键,列表(值))拆分为单个(k,v)对以应用进一步转换?
答案 0 :(得分:2)
my_rdd = sc.parallelize([(u'key1', u'1'), (u'key2', u'1'), (u'key1', u'2'), (u'key2', u'3'), (u'key4', u'1'), (u'key1', u'4'), (u'key4', u'1'), (u'key6', u'2'), (u'key7', u'4'), (u'key8', u'5'), (u'key9', u'6'), (u'key10', u'7')])
#filter keys which are associated to atleast 2 values
filter2_rdd = my_rdd.groupByKey() \
.mapValues(lambda x: list(x)) \
.filter(lambda x: len(x[1])>=2) \
.flatMap(lambda x: [(x[0],item) for item in x[1]])
#filter values associated to atleast 2 keys.
filte1_rdd = filter2_rdd.map(lambda x: (x[1],x[0])) \
.groupByKey().mapValues(lambda x: list(x))\
.filter(lambda x: len(x[1])>=2)\
.flatMap(lambda x: [(item,x[0]) for item in x[1]])
这会有效!!
答案 1 :(得分:0)
按键减少,过滤和加入:
>>> rdd.mapValues(lambda _: 1) \ # Add key of value 1
... .reduceByKey(lambda x, y: x + y) \ # Count keys
... .filter(lambda x: x[1] >= 2) \ # Keep only if number is >= 2
... .join(rdd) # join with original (serves as filter)
... .mapValues(lambda x: x[0]) # reshape