为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

撒科打诨 2022-01-18 17:41:02
我有一个我广播的 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 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

观察调用b_filter.value.items()内部返回的值filter与以下内容相同:


nested_filter.items()

#[('user1', '2018-02-15')]

那么你的比较就变成了:


("user1","2018-02-05") < [('user1', '2018-02-15')]

#False

这是False。假设这nested_filter是一个只有 1 项的字典(如此处所示),您可能打算做的是与列表的第一个元素进行比较:


("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,但对于其他日期格式,您可能需要转换为datetime对象。


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号