2017-02-07 4 views
-3

は、我々は次のサンプルデータを持っていると言う:私は、サンプルファイルの各行、例えば1、2、3、0、3、1の最後の値をチェックしたいPySparkでは、値を比較して別のRDDを返す関数にRDDを送信するにはどうすればよいですか?

1,John,Martinez,North Lauderdale,20160101,1 
2,John,Martinez,Plantation,20170101,2 
3,John,Martinez,North Lauderdale,20161022,1 
4,John,Martinez,Pembroke Pines,20181231,0 
5,John,Martinez,Plantation,20190101,3 
6,John,Martinez,Plantation,20200101,1 
7,John,Martinez,Plantation,20210101,9 

を、9

def func(input): 
    if str(input[5]) is "1": 
     rdd_trdln = input.map(lambda line: (line, "A")) 
    else: 
     rdd_trdln = input.map(lambda line: (line, "O")) 
     return rdd_trdln 
input = sc.textFile("file.txt").map(lambda line: line.split('\t')) 
return_FirstFunc = input.map(firstFunc) 

私は取得していますエラー:

AttributeError: 'list' object has no attribute 'map'

+0

のようにテストすることができます

def convert_func(line): """ This is not returning an RDD. It returns a Python string """ splits = line.split(',') # Your lines are not tab-delimited splits.append("A" if splits[5] == "1" else "O") return ",".join(splits) lines = sc.textFile("file.txt") converted_lines = lines.map(convert_func) 

は、公式ドキュメントからのクイックスタートガイドで読んでいくつかの努力を入れて、アドバイスの言葉です。この質問は研究に欠けており、非常に悪いです。 – eliasah

+0

upppssssそれは@eliasah –

答えて

0

Spark RDD.map()と通常のPython map()の機能には違いがあります。

sc.textFile("file.txt").map(lambda line: line.split('\t'))があるときは、PythonリストのRDDを作成しました。したがって、input.map(func)に電話するときは、funcのリストを受け入れる必要があります.RDDは受け付けません。

したがって、input.mapはあなたのエラー...

'list' object has no attribute 'map'

があるそしてそれはPythonのエラーではなく、スパーク・エラーです。

あなただけのリストの中に文字を追加したい場合は、あなたのコードは

def func(input): 
    if input[5] == "1": 
     input.append("A") 
    else: 
     input.append("O") 
    return input 

それとも、もっとニシキヘビ

def func(input): 
    input.append("A" if input[5] == "1" else "O") 
    return input 

それともあなたが取るためにあなたの関数を定義することができますでしょう文字列としての行全体がそこに分割されます。
リストのRDDを使用すると、作業が面倒で時々覚えにくくなります。あなたがここにそう

for line in converted_lines.collect(): 
    print(line) 
+0

しかし、私は複数のステップのための複数の機能を持っている場合...私は各機能の中で分割する必要がありますか? –

+0

あなたが望んでいた出力ははっきりしませんでしたが、現在は( '' line''、 '' A''/'' '0" ')のRDDを持っています。あなたがラインからデータを抽出する必要がある場合は、はい、あなたはもう一度分割する必要があります –

+0

とにかく私はRDDまたは既に分割されたデータを送信することができますか? –

-1

純粋なPythonの側からは、あなたが標準listの上にマップする場合、あなたはbuilt-in map functionを使用することができます。 python3は、Python 2(リスト)に異なる結果タイプ(map反復子)を生成

input = map(lambda line: line.split('\t'), sc.textFile("file.txt")) 

注意。

+0

のために意味されていたと私は値を確認するつもりですか?それはなぜ私が関数を持っていたのか... –

+0

'sc.textFile(" file.txt ")'は普通のリストのようなPython反復可能ではありません。私はこれがそのように機能するとは思わない。 –

関連する問題