2016-07-06 5 views
1

に私のデータフレームの列にアクセスすることはできません、これは私が実行しているコマンドです:私はスパークを学んでいると私は私の列にアクセスすることはできません理由を知りたいApacheのスパーク

shakespeareDF.select(explode(split(shakespeareDF.sentence, " ")).alias("word")).filter(shakespeareDF.word != "") 

または

shakespeareDF.select(explode(split(shakespeareDF.sentence, " ")).alias("word")).filter(shakespeareDF["word"] != "") 

両方のコマンドは私にAttributeError: 'DataFrame' object has no attribute 'word'を与えますが、私はなぜそれがわかりません。

面白いことに、これは私の質問があるshakespeareDF.select(explode(split(shakespeareDF.sentence, " ")).alias("word")).filter(col("word") != "")

を動作することである:なぜもないshakespeareDF.wordshakespeareDF["word"]作品とその理由col("word")はいますか?

ありがとう

答えて

2

両方の動作については、面白くないか奇妙なことはありません。

最初に作成したDataFrameは、作成とエイリアスで分割します。これにより、その列で新しいDataFrameが作成されます。したがって、最初に作成したDataFrameの中から新しく作成された列を呼び出すと、明らかにそこには表示されず、エラーが表示されます。

ここで、2回目の試行については、新しく作成されたDataFrameのスキーマ内で見つかるDataFrameに関係なく、列ワードにアクセスしようとしています。

私はこれがあなたの混乱に答えることを願っています。

2

shakespeareDF ["word"]を使用すると、シェイクスピアPDFのTHE列が使用されます。 col( "word")を使用するのは列の単語を意味し、はまだありませんはまだDataFrameにバインドしていません。

バインド列を使用すると、メソッド呼び出しをチェーンできないことを意味します。

explosedDF = shakespeareDF.select(explode(split(shakespeareDF.sentence, " ")).alias("word")) 
explosedDF.filter(explosedDF["word"] != "") 
1

ロッキーヤンの回答に追加すると、フィルタ機能の出力も保存する必要があります。後者はN個のスペースがN-1個の空の文字列に分割される結果となるため、単一のスペースではなく、複数のスペースでも分割されます。 (空の文字列は、その後、次のフィルタによって除去さが、ちょうど最初の場所でそれらを生成しない方が良いでしょう。)あなたの入力は空行を持っている場合でも、空白の配列に分割すること

testSentenceDF = sqlContext.createDataFrame([('Some spaces',), ('are repeated',), ('rather unnecessarily.',)], ['sentence']) 
testWordsNaiveDF = testSentenceDF.select(explode(split(testSentenceDF.sentence, ' ')).alias('word')) 
testWordsNaiveDF.show() 

#+--------------+ 
#|   word| 
#+--------------+ 
#|   Some| 
#|  spaces| 
#|   here| 
#|    | 
#|   are| 
#|  repeated| 
#|    | 
#|    | 
#|    | 
#|unnecessarily.| 
#+--------------+ 

testWordsImprovedDF = testSentenceDF.select(explode(split(testSentenceDF.sentence, '\s+')).alias('word')) 
testWordsImprovedDF.show() 

#+--------------+ 
#|   word| 
#+--------------+ 
#|   Some| 
#|  spaces| 
#|   here| 
#|   are| 
#|  repeated| 
#|unnecessarily.| 
#+--------------+ 

testWordsNaiveFilteredDF = testWordsNaiveDF.filter(testWordsNaiveDF.word != '') 
testWordsNaiveFilteredDF.show() 

#+--------------+ 
#|   word| 
#+--------------+ 
#|   Some| 
#|  spaces| 
#|   here| 
#|   are| 
#|  repeated| 
#|unnecessarily.| 
#+--------------+ 

注意、または行の先頭または末尾に空白がある場合、split/explodeの結果、空の文字列エントリが生成され、フィルタリングが必要になります。入力内に連続した空白があった場合、複数の空文字列は作成されません。

関連する問題