我有一个广播的python字典,其中包含用户的日期过滤器。
nested_filter = {"user1":"2018-02-15"}
b_filter = sc.broadcast(nested_filter)
我想使用此广播变量过滤行数少于过滤日期的较大RDD。
rdd_set = sc.parallelize([("user1","2018-02-05"), ("user1","2018-02-20")])
rdd_set.filter(lambda fields: fields <= b_filter.value.items()).collect()
但是它返回一个空的RDD。
有人可以指出我做错了什么吗?另外,我是否需要将字符串日期转换为日期对象?
正确的结果应该是:
[("user1","2018-02-05")]
答案 0 :(得分:1)
观察到r='replacement_text'
sed -E "/eval_config:\s*\{/ {N;s/\n[^\}]+/\n<$r>/}" filename
调用中b_filter.value.items()
返回的值与:
filter
因此,您的比较变为:
nested_filter.items()
#[('user1', '2018-02-15')]
哪个是("user1","2018-02-05") < [('user1', '2018-02-15')]
#False
。假设False
是仅包含一项的字典(如下所示),您可能打算做的就是与列表的第一个元素进行比较:
nested_filter
要“修复”您的代码,您可以执行以下操作:
("user1","2018-02-05") < nested_filter.items()[0]
#True
但是,相反,我认为您真正想要的是以下内容:
rdd_set.filter(lambda fields: fields <= b_filter.value.items()[0]).collect()
#[('user1', '2018-02-05')]
此方法使用rdd_set.filter(lambda fields: fields[1] <= b_filter.value.get(fields[0])).collect()
#[('user1', '2018-02-05')]
从fields[0]
获取日期(如果不存在,则返回nested_filter
),然后将值与None
进行比较。
您已经注意到,此比较将在字典上按字符串顺序进行。如果您的日期保持为fields[1]
格式,那么这对您来说就不是问题,但是对于其他日期格式,则可能需要转换为YYYY-MM-DD
对象。