Pyspark 将行数据转换为键值对

Posted

技术标签:

【中文标题】Pyspark 将行数据转换为键值对【英文标题】:Pyspark Convert row data to key value pairs 【发布时间】:2018-04-22 04:42:17 【问题描述】:

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

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

【问题讨论】:

您在寻找rdd.map(lambda row: (tuple(row[0]), row[1]))吗? @pault 当我写 rdd.map(lambda row:(tuple(row[0]), row[1])).take(5) 时,它给了我输出 [(('(',), '['), (('(',), '['), (('(',), '['), (('(',), '['), (('(',), '[')] 而我想要 row[0]=[Fire Grilled Steak Bowl, Veri Veri Teriyaki Marinade & Sauce]row[1]=1 您的数据真的是完全这样存储的吗?括号和括号有吗?文本周围没有引号?更好的问题是它是如何结束的?是否有可能在上游某个地方解决问题?你可以构建一个解析器,但这会很复杂。 【参考方案1】:

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

但是,从您提供的示例来看,您似乎可以通过拆分逗号和去除括号来获得所需的输出。

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

【讨论】:

非常感谢您的帮助。我认为你的建议有效。数据正是这种格式,因为其他程序会生成它。

以上是关于Pyspark 将行数据转换为键值对的主要内容,如果未能解决你的问题,请参考以下文章

如何在php中将对象数组转换为键值对

将NSString转换为键值对

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

将 json 字典列转换为键值对行(Redshift+Postgresql)

C# 给枚举定义DescriptionAttribute,把枚举转换为键值对

C# 给枚举定义DescriptionAttribute,把枚举转换为键值对