实际问题举例
当面对的数据是{“山东”: [“山东煎饼”, "烟台苹果", "莱阳梨", "灌肠"], "河南": ["胡辣汤", "烩面"]}时,有时需要将其展成(地名,产品)数据形式,这时候就可以用到flatMapValues函数对其进行转变。
函数说明
flatMapValues是先对数据进行mapValues操作,然后对其返回的结果进行flatMap操作。在flatMap操作阶段,先将key值和value值的每个元素一一对应形成新的键值队[(key, values[0]), ..., (key, values[-1])]。
data_example = list({"山东": ["山东煎饼", "烟台苹果", "莱阳梨", "灌肠"], "河南": ["胡辣汤", "烩面"]}.items())
data_rdd = spark.sparkContext.parallelize(data_example)
data_rdd.flatMapValues(lambda x: x).collect()
"""
[('山东', '山东煎饼'),
('山东', '烟台苹果'),
('山东', '莱阳梨'),
('山东', '灌肠'),
('河南', '胡辣汤'),
('河南', '烩面')]
"""
在上述例子中,mapValues阶段返回的是值本身,可以先对其处理,然后再将其传递给flatMap阶段。
def length_product(x):
for i in x:
yield i.endswith("梨")
data_rdd.flatMapValues(length_product).collect()