2016-09-20 5 views
2

私は、Python上でSpark Data Framesを使用して2つのデータフレームに参加するのに苦労しています。私は2つのデータフレームを持っているので、各データフレームごとにユニークにするためにカラムの名前を変更しなければならなかったので、後でどのカラムがどのカラムであるかを知ることができました。私は(firstDfとsecondDfがスパークデータフレームは、関数createDataFrameを使用して作成されている)の列の名前を変更するためにこれをした:Pyspark DataFrame - 変数を使って結合する方法は?

oldColumns = firstDf.schema.names 
newColumns = list(map(lambda x: "{}.{}".format('firstDf', x), oldColumns)) 
firstDf = firstDf.toDF(*newColumns) 

私は2番目のデータフレームのためにこれを繰り返しました。それから私は、次のコードを使用して、それらを接続しようとしました:

from pyspark.sql.functions import * 

firstColumn = 'firstDf.firstColumn' 
secondColumn = 'secondDf.firstColumn' 
joinedDF = firstDf.join(secondDf, col(firstColumn) == col(secondColumn), 'inner') 

このようにそれを使用して、私は次のエラーを取得する:

AnalysisException "cannot resolve 'firstDf.firstColumn' given input columns: [firstDf.firstColumn, ...];"

これは、列が入力列の配列に存在することを示すためにだけでした。

私は、コードのこの部分を使用してそれらを結合することができるよデータフレームの列に名前を変更しない場合は、次の

joinedDf = firstDf.join(secondDf, firstDf.firstColumn == secondDf.firstColumn, 'inner') 

をしかし、これは私のあいまいな列名とデータフレームを与えます。

これにアプローチする方法についてのご意見はありますか?

答えて

0

一般に、名前にドットを使用しないでください。これらは特別な意味を持っています(テーブルを決定するか、structのフィールドにアクセスするために使用できます)。正しく認識されるには追加の作業が必要です。複雑なケースについては

from pyspark.sql.functions import col 

firstDf = spark.createDataFrame([(1, "foo")], ("firstColumn", "secondColumn")) 
secondDf = spark.createDataFrame([(1, "foo")], ("firstColumn", "secondColumn")) 

column = 'firstColumn' 
firstDf.join(secondDf, [column], 'inner') 

## DataFrame[firstColumn: bigint, secondColumn: string, secondColumn: string] 

は表の別名を使用します:

firstColumn = 'firstDf.firstColumn' 
secondColumn = 'secondDf.firstColumn' 

firstDf.alias("firstDf").join(
    secondDf.alias("secondDf"), 
    # After alias prefix resolves to table name 
    col(firstColumn) == col(secondColumn), 
    "inner" 
) 

## DataFrame[firstColumn: bigint, secondColumn: string, firstColumn: bigint, secondColumn: string] 

あなたはまた、直接の親フレームを使用することができます。

column = 'firstColumn' 

firstDf.join(secondDf, firstDf[column] == secondDf[column]) 
+0

をエクイするため

はあなたが必要とするすべての列名です合流します返信いただきありがとうございます。特に名前の中にドットを使用しないことに関するヒント。最初のアプローチは機能しますが、2つの結合されたDataFramesの各列に固有の列名を持つように、結合したDataFrameが必要です。示唆されているようにテーブルエイリアスを使用すると、質問に示したのと同じAnalysisExceptionエラーが発生します。 –

+0

うまくいくはずです。完全に再現可能な例のためにテーブル定義を追加しました。 – zero323

+0

申し訳ありませんが、私はちょうどそのドットを変更すると機能することに気付きました。返信ありがとう! –

関連する問題