python+spark 如何将一行数据转成多行,困惑了好久,测试了好多次都没有成功,Mark一下:
原数据格式大致如下:
1B36F016DC7 a,b,c,d
1B676E0B753 e,f
希望转成:
1B36F016DC7 a
1B36F016DC7 b
1B36F016DC7 c
1B36F016DC7 d
1B676E0B753 e
1B676E0B753 f
代码如下:
rdd= sc.textFile(infile,1,use_unicode=False)
def split_func(line):
keyvalues=[]
key,values=line.split("\t")
for x in values.split(","):
keyvalues.append((key,x))
#这里返回keyvalues,或迭回迭代器 iter(keyvalues) 都可以
return keyvalues
#map作用于每一个元素(textFile读入的为一行一个元素,不是每个字符)
#这里得到的格式为:[ [ ] , [ ] , [ ] ]
filterNotagsRdd=originalDataRdd.map(split_func)
#flatmap,将[]或迭代器返回的tuple(key,value)元组打平
#得到[ (),(),() …] 多个tuple组成的一个list
#这里得到的格式为:[ (),(),() … ] 原来子[ ]的tuple解析出来放外层了
filterNotagsRdd=filterNotagsRdd.flatMap(lambda x:x)
#上面flatMap后y人为只有一行数据,为一个 [],里面的tuple元组,
#map恰恰是作用于每个元素的,这里一个tuple为一个元素了.
#所以输出key value的数据,这里就转成多行数据了。
#下面的lambda等于
def createKeyValue_func(tupleValue):
x,y=tupleValue
return x+"\t"+y
filterNotagsRdd=filterNotagsRdd.map(lambda (x,y): x+"\t"+y)
print(filterNotagsRdd.collect())
#filterNotagsRdd.saveAsTextFile(out) #或存入hdfs文件查看