1

次のように私は(簡体字)、「doorsDF」VARのデータフレームを持っている:スパーク:どのように一致するものを見つけるために、異なるデータフレームからネストされたデータを使用する(スカラ)

+-----+-----+-----+------+ 
| door| x| y| usage| 
+-----+-----+-----+------+ 
| a| 32| 14|  5| 
| b| 28| 53|  1| 
| c| 65| 94| 23| 
| d| 68| 53|  1| 
| e| 51| 94| 12| 
+-----+-----+-----+------+ 

と、次のように私は「peopleDF」VARのデータフレームを持っています(簡体字):

+-------+-----+ 
| person| x| 
+-------+-----+ 
| foo| 30| 
| bar| 66| 
| Morty| 52| 
+-------+-----+ 

は、トップ3行

私は、人が建物に入るために使用するどのようなドア(複数可)のベースライン「予測」を作りたいを示します。重要なのは、人が5 'x'単位内にいる場合です。

たとえば、fooはドア「a」と「b」を通り抜けます。モルティはドア「c」と「d」を歩くだろう。バーはドア「e」だけを通って歩くだろう。

進歩は、これまで:使用することにより、第2のデータフレームに「潜在的な終了」列を追加しようとしました:

val sequence = doorsDF.select("door").rdd.map(r => r(0)).collect().mkString(",") 
val doorColumn = lit(sequence)  
peopleDF = peopleDF.withColumn("potentialDoors", doorColumn) 

結果(新peopleDF):

+-------+-----+---------------+ 
| person| x| potentialDoors| 
+-------+-----+---------------+ 
| foo| 30|  a,b,c,d,e| 
| bar| 66|  a,b,c,d,e| 
| Morty| 52|  a,b,c,d,e| 
+-------+-----+---------------+ 

しかし、今、私がしようとしたとき潜在的なドアをループするためにudfを使用し、その名前を使ってdoorsDFをフィルタリングし、x値をpeopleDFのx値と比較すると、nullpointer例外が発生します。私はそれがネストされた状況でフィルタを使用しようとしているからだと読んだ。

利用可能な機能でこれを行うには、udfやrddに頼っているのではないかもしれませんが、それは私を逃してしまいます。私は長い間それを続けてきました。

また、なぜ私はpotentialDoorsという文字列を(配列とは対照的に)持っていたのかは、私の目的のために扱いやすくなったためです。

ご協力いただきましてありがとうございます。

答えて

0

私は、次の手順を実行して、この暫定的に解決した:

  • を行の配列にdoorsDFデータフレームを回します。 Lords says doorsArr
  • potentialDoor列を追加するためにpeopleDFにUDFを適用すると、ドアDFをフィルタリング/照会しようとする代わりに、そのdoorsArr配列をループしました。

"潜在的な"プールを正常に減らすことができました。

これはまだ効率が悪いと感じ、ハードコーディングが必要でした。だから私はまだクリーナーの提案にオープンしています!私は提供された機能を使いこなしたい。読んでいただきありがとうございます。

関連する問題