pyspark处理文本文件

时间:2015-03-01 05:35:50

标签: python apache-spark

我有一个这样的文件,我在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,其中每个键都是一个用户ID(id1,id2),每个值都有多个记录(以逗号分隔),每个记录都有多个项目(由管道分隔) )

我想减少文件,使得每个id:(id1和id2)将发出尽可能多的行,因为它们具有记录数,用户id作为键,第7个字段/第5个字段,第6个字段作为值

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

感谢任何帮助

1 个答案:

答案 0 :(得分: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')]