Pyspark-使用广播词典中的日期过滤RDD

时间:2019-04-22 18:15:38

标签: python apache-spark pyspark rdd

我有一个广播的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")]

1 个答案:

答案 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对象。