【问题标题】:pyspark processing a text filepyspark 处理文本文件
【发布时间】:2015-05-01 15:59:23
【问题描述】:

我有一个这样的文件,我在 PythonRDD 中读过。

[(u'id1', u'11|12|13|14|15|16|17|18|,21|22|23|24|25|26|27|28|), (u'id2', u'31|32|33|34|35|36|37|38|,41|42|43|44|45|46|47|28|)]

表示: RDD 是一个pairRDD,其中每个key 是一个用户id(id1, id2),每个value 有多个记录(用逗号分隔),每个记录有多个项目(用管道分隔) )

我想减少文件,以便每个 id: (id1 和 id2) 将发出与记录数一样多的行,用户 id 作为键,第 7 个字段/第 5 个字段,第 6 个字段作为值

id1 => 17/15, 16
id1 => 27/25, 26
id3 => 37/35, 36
id4 => 47/45, 46

感谢任何帮助

【问题讨论】:

    标签: python apache-spark


    【解决方案1】:

    试试这样的(flatMap 是诀窍):

    input=[(u'id1', u'11|12|13|14|15|16|17|18|,21|22|23|24|25|26|27|28|'), (u'id2', u'31|32|33|34|35|36|37|38|,41|42|43|44|45|46|47|28|')]
    inputRdd=sc.parallelize(input)
    
    def splitAtPipe(value):
      valueParts=value.split('|')
      return (valueParts[6]+"/"+valueParts[4],valueParts[5])
    
    inputRdd.flatMapValues(lambda data: data.split(","))
      .mapValues(splitAtPipe)
      .map(lambda (idx, (data1, data2)): (idx, data1, data2))
      .collect()
    
    # Result
    # [(u'id1', u'17/15', u'16'), (u'id1', u'27/25', u'26'), (u'id2', u'37/35', u'36'), (u'id2', u'47/45', u'46')]
    

    【讨论】:

    • 非常感谢。我正在尝试使用 flatMap 但它不起作用。我不知道 flatMapValues。我正在检查文档spark.apache.org/docs/0.8.1/api/pyspark/…,但没有提到,虽然在 1.1.0 文档中提到了 flatMapValues
    • 当我打印它时,它会打印在一个文件中,例如:(u'id1', u'text', number).... 我怎样才能在没有'('的文件中打印它, 'u', and ')'... 因为我需要这个文件用于 ALS 算法,所以我需要没有大括号和 'u' 的简单格式的输出文件
    • 使用.map将元组转换成字符串.map(lambda (idx, (data1,data2)): "{0}:{1},{2}".format(idx,data1,data2)) Python字符串格式化工具也很实用。
    猜你喜欢
    • 2019-08-07
    • 2014-06-23
    • 1970-01-01
    • 2017-06-18
    • 2022-10-18
    • 2011-05-16
    • 1970-01-01
    • 2019-10-10
    • 2018-04-07
    相关资源
    最近更新 更多