以下のユースケースを解決するための最適化された、または最良のパフォーマンスのアプローチとはスパークデータフレームでの複数列計算の最適化方法?
私たちの関心が1列のメッセージである100万行と100列のデータフレームを考えてみましょう。私は、メッセージ内のキーワードの存在を照合する条件に基づいて3つの新しい列を構築する必要があります。
- メッセージ:コードの開発に向けスタックオーバーフローの寄与は日によって 増加の日です
- FLAG1キーワード:スタック、
- FLAG2キーワード弛み:TwitterやFacebook、のWhatsApp
- FLAG3キーワード:フロー、実行し、増加する
予想される出力:(メッセージ、フラグ1、フラグ2、フラグ3)コード開発に対するスタックオーバーフローの貢献度が日々増加しています。1,0,0
アプローチ1
val tempDF = df.withColumn("flag1",computeFlag(col("message"))).withColumn("flag2",computeFlag(col("message"))).withColumn("flag3",computeFlag(col("message")))
アプローチ2
val tempDF = df.withColumn("flagValues",computeMultipleFlags(col("message"))).withColumn("_tmp", split($"flagValues","#")).select($"message",$"_tmp".getItem(0).as("flag1"),$"_tmp".getItem(1).as("commercial"),$"_tmp".getItem(2).as("flag2"),$"_tmp".getItem(3).as("flag3")).drop("_tmp")
UDF:computeFlag各キーワードリスト
UDFの正確な一致に基づいて、1または0を返す:へcomputeMultipleFlags flag1、flag2のそれぞれのキーワードの完全一致に基づいて、1または0の区切られた結果を返す。 dフラグ3:例1#0#0
私は両方のアプローチを使用して解決しましたが、パフォーマンスを向上させるにはアプローチ2を参照してください。ご意見をお聞かせください。
スパークデータフレームは、デフォルトでは並列化されているが、どのようなアプローチ1.上この場合 作品はFLAG1、FLAG2、FLAG3列は パラレルまたはシーケンシャルに計算されますでしょうか?列に対して複数行の複数のスレッド
計算:は自動的に並列プロセスの私の入力欄 「メッセージ」データフレームをスパークのでしょうか?どちらの場合も