2017-08-15 10 views
-1

の内側に私は」はAttributeErrorとしての投げをマップする使用しようとしたときPyspark Spliting一覧リストやタプル

[('HOMICIDE', ('2017', 1)), 
('DECEPTIVE PRACTICE', ('2015', 10)), 
('DECEPTIVE PRACTICE', ('2014', 3)), 
('DECEPTIVE PRACTICE', ('2017', 14)), 
('DECEPTIVE PRACTICE', ('2016', 14))] 

に変換する方法

[('HOMICIDE', [('2017', 1)]), 
('DECEPTIVE PRACTICE', [('2017', 14), ('2016', 14), ('2015', 10), ('2013', 4), ('2014', 3)]), 
('ROBBERY', [('2017', 1)])] 

を以下しています属性「マップ」がありません "

rdd = sc.parallelize([('HOMICIDE', [('2017', 1)]), ('DECEPTIVE PRACTICE', [('2017', 14), ('2016', 14), ('2015', 10), ('2013', 4), ('2014', 3)])]) 
y = rdd.map(lambda x : (x[0],tuple(x[1]))) 

答えて

2

map代わりにPythonのリストのrddの方法ですので、あなたは、内側のリストを平らにするflatMapを使用することができ、その後、最初にリストを並列化する必要があると:

rdd = sc.parallelize([('HOMICIDE', [('2017', 1)]), 
         ('DECEPTIVE PRACTICE', [('2017', 14), ('2016', 14), ('2015', 10), ('2013', 4), ('2014', 3)]), 
         ('ROBBERY', [('2017', 1)])]) 

rdd.flatMap(lambda x: [(x[0], y) for y in x[1]]).collect() 

# [('HOMICIDE', ('2017', 1)), 
# ('DECEPTIVE PRACTICE', ('2017', 14)), 
# ('DECEPTIVE PRACTICE', ('2016', 14)), 
# ('DECEPTIVE PRACTICE', ('2015', 10)), 
# ('DECEPTIVE PRACTICE', ('2013', 4)), 
# ('DECEPTIVE PRACTICE', ('2014', 3)), 
# ('ROBBERY', ('2017', 1))] 
+0

それは働いた...情報をありがとう... –

2

代わりにリストの理解はどうですか?

y = [(x[0], i) for x in rdd for i in x[1]] 

戻り

[('HOMICIDE', ('2017', 1)), ('DECEPTIVE PRACTICE', ('2017', 14)), ('DECEPTIVE PRACTICE', ('2016', 14)), ('DECEPTIVE PRACTICE', ('2015', 10)), ('DECEPTIVE PRACTICE', ('2013', 4)), ('DECEPTIVE PRACTICE', ('2014', 3))] 
+0

pysparkを使用したとき、Pythonでうまくいきました。データをディスクに移動する必要がありました....私の悪いことはsc.parallelizeとは言わないと思います。 質問 。ありがとう@ason​​gtoruin –

+0

@SachinSukumaran私の悪い!とにかく答えがあるようです。 – asongtoruin

関連する問題