我有一个如下所示的数据文件:
([Fire Grilled Steak Bowl, Veri Veri Teriyaki Marinade & Sauce],1)
([Fat Free Strawberry Yogurt, Strawberry Banana Juice],1)
([Organic Unsweetened & Salt Free Sunflower Seed Butter, Organic Broccoli Crowns],1)
([Roma Tomato, Vanilla Soymilk],3)
([15 Calories Light Lemonade, Lemon-Lime 12 Pack Soda],1)]
当我将这些数据放入 RDD 中时,
data=sc.textFile("hdfs:\\h1:9000\data.txt")
data.collect()
输出如下所示
['([Fire Grilled Steak Bowl, Veri Veri Teriyaki Marinade & Sauce],1)', '([Fat Free Strawberry Yogurt, Strawberry Banana Juice],1)', '([Organic Unsweetened & Salt Free Sunflower Seed Butter, Organic Broccoli Crowns],1)', '([Roma Tomato, Vanilla Soymilk],3)', '([15 Calories Light Lemonade, Lemon-Lime 12 Pack Soda],1)']
我正在使用 pyspark 并希望将此 RDD 转换为键值对,其中列表[item1,item2]
将是键,逗号后的数字将是值。当我尝试访问它时x[0]
,x[1]
我最终分别得到(
和[
应该很简单,我不明白如何获取x[0]=[item1,item2]
和x[1]=num
。
您的源数据似乎以不方便的格式存储。它几乎就像是一个打印的元组,但是字符串周围没有引号阻止您将该行作为对象进行评估。
但是,从您提供的示例中,您似乎可以通过分隔逗号和去除括号来获得所需的输出。
之后,您可以map()
根据需要调用和构建您的键值对。
data = [
'([Fire Grilled Steak Bowl, Veri Veri Teriyaki Marinade & Sauce],1)',
'([Fat Free Strawberry Yogurt, Strawberry Banana Juice],1)',
'([Organic Unsweetened & Salt Free Sunflower Seed Butter, Organic Broccoli Crowns],1)',
'([Roma Tomato, Vanilla Soymilk],3)',
'([15 Calories Light Lemonade, Lemon-Lime 12 Pack Soda],1)'
]
rdd = sc.parallelize(data)
rdd.map(lambda row: map(lambda x: x.strip().strip("[]()"), row.split(",")))\
.map(lambda row: ((row[0], row[1]), int(row[2]))).collect()
哪个打印:
[(('Fire Grilled Steak Bowl', 'Veri Veri Teriyaki Marinade & Sauce'), 1),
(('Fat Free Strawberry Yogurt', 'Strawberry Banana Juice'), 1),
(('Organic Unsweetened & Salt Free Sunflower Seed Butter', 'Organic Broccoli Crowns'), 1),
(('Roma Tomato', 'Vanilla Soymilk'), 3),
(('15 Calories Light Lemonade', 'Lemon-Lime 12 Pack Soda'), 1)]
这假设每行正好有 3 个逗号。如果文本中有任何逗号,此方法将不起作用。如果该假设无效,那么我的建议是修改生成这些文件的程序以生成更友好的格式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句