2017-05-02 16 views
0

データフレームがあり、リストから列名を渡すことでtoDFを使用して名前を変更したいのですが、ここで列リストは動的です。以下のようにエラーが発生すると、どのように達成できますかこの?Pyspark - toDF関数に渡すリスト/タプル

>>> df.printSchema() 
root 
|-- id: long (nullable = true) 
|-- name: string (nullable = true) 
|-- dept: string (nullable = true) 

columns = ['NAME_FIRST', 'DEPT_NAME'] 

df2 = df.toDF('ID', 'NAME_FIRST', 'DEPT_NAME') 
(or) 
df2 = df.toDF('id', columns[0], columns[1]) 

これは、我々が入力されたデータフレームであるだろうどのように多くの列を知っているので、DF2するリストを渡したいいけない場合、私はここ

df2 = df.toDF('id', columns) 
pyspark.sql.utils.IllegalArgumentException: u"requirement failed: The number of columns doesn't match.\nOld column names (3): id, name, dept\nNew column names (2): id, name_first, dept_name" 

それ以下のように試してみました動作しません。リストを単一の項目として扱い、リストから列を渡す方法は?

答えて

4

DF2 = df.toDF(列)は、以下のように*を追加し、動作しません -

columns = ['NAME_FIRST', 'DEPT_NAME'] 

df2 = df.toDF(*columns) 

"*" は "スプラット" オペレータである:それは、入力としてリストを取り、ファンクションコールの実際の位置引数に展開する

0

「列」配列にすべての列を追加しなかったことを除いて、試したことは正しいです。

この動作します:私はpysparkに続くすべてのステップと

columns = ['ID','NAME_FIRST', 'DEPT_NAME'] 
df2 = df.toDF(columns) 

を更新答え:

list=[(1,'a','b'),(2,'c','d'),(3,'e','f')] 
df = sc.parallelize(list) 
columns = ['ID','NAME_FIRST', 'DEPT_NAME'] 
df2 = df.toDF(columns) 
+0

彼はすでにそれを試してみましたが、その投げ込みエラー – Pushkr

+0

私はここに投稿する前にこのコードをpysparkでテストしました。 – alpeshpandya

+0

あなたがここでやっていることは、新しいデータフレームを作成することですが、問題は、リストを渡すことによって既存のデータフレームの名前を変更する方法です。上記のコードを実行したら、 'newCols = ['emp_id'、 'FIRST_name'、 'DEPT_NAME']'および 'df.toDF(newCols)'を実行し、それが動作するかどうかを確認してください。 – Pushkr