Pyspark将行数据转换为键值对

时间:2018-04-22 04:42:18

标签: apache-spark pyspark rdd key-value

我有一个如下所示的数据文件:

([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

1 个答案:

答案 0 :(得分:0)

 

好像您的源数据以不方便的格式存储。它几乎就像是一个打印的元组,但是字符串周围没有引号阻止你将该行作为对象进行评估。

但是,从您提供的示例中,似乎您可以通过分割逗号和剥离括号来获得所需的输出。

之后,您可以调用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个逗号。如果文本中有逗号,则此方法不起作用。如果该假设无效,那么我的建议是修改生成这些文件的程序以生成更友好的格式。