2016-05-11 11 views
-1

pysparkのcsvファイルのヘッダーから文字列のリストを作成しようとしています。 csvファイルのヘッダーはUnicode形式です。私は、ヘッダを読み、このコードを書いたが、それはヘッダから個々の値でリストを形成していない:は、pysparkのcsvファイルのヘッダーから文字列のリストを作成します。

def filter(line): 

    return line 

read_file = sc.textFile('file:///file1.csv').zipWithIndex().filter(lambda (line, rownum): rownum == 0).map(lambda (line, rownum): line) 


data = (read_file 
     .map(lambda line: line.split(",")) 
     .filter(lambda line: len(line) >= 1) 
     .map(filter)) 

print data.collect() 

私が見出力は次のようになります。私はそれがしたいながら

[[u'header1', u'header2', u'header3', u'header4', u'header5']] 

be ['header1','header2','header3','header4','header5']

どのように修正してリストを作成できますか?

あなたの特定の問題を解決するのに十分な簡単
+1

コードの最後に '[0]'を追加するだけです。 'u'を心配しないでください、無害です。つまり、実際には良いことですが、それは単なる文字列ではなく、ユニコードオブジェクトです。 data.collect()内のヘッダ:print headerを試してみたら、ヘッダだけが表示されます: –

+0

@AlexHall '[0]'はどこに置かれますか? – user2966197

+0

表示されるのは、1つの要素、つまりリストを含むリストです。その要素を '[0]'で抽出することができます。 'data.collect()[0]'または 'data.collect()[0]:print header'の' for header '(これは忘れました)。 –

答えて

1

: ちょうど明らかdata.collect()[0]のように結果の[0]を取って代わりmap

data = read_file.flatMap(lambda l: l.split(",")) 

flatMapを使用するには、また、溶液です。

しかし、あなたが現在行っているやり方では、最初のものを除くすべての行を破棄するためにファイル全体を繰り返しています。 rddに.take(1)を使用することをお勧めします。

first_line = sc.textFile('test.csv').take(1) 
first_line[0].split(",") 

この2番目の解決方法は、長いファイルの方がはるかに高速です。

また、フィルタ機能は現在目的を果たしていないことにご注意ください。.map(filter)を省略することもできます。

関連する問題