bugfix> scala > 投稿

私は以下のようなデータフレームを持っています

+---+------------+----------------------------------------------------------------------+
|id |indexes     |arrayString                                                           |
+---+------------+----------------------------------------------------------------------+
|2  |1,3         |[WrappedArray(3, Str3), WrappedArray(1, Str1)]                        |
|1  |2,4,3       |[WrappedArray(2, Str2), WrappedArray(3, Str3), WrappedArray(4, Str4)] |
|0  |1,2,3       |[WrappedArray(1, Str1), WrappedArray(2, Str2), WrappedArray(3, Str3)] |
+---+------------+----------------------------------------------------------------------+

arrayStringをループし、最初の要素をインデックスとして、2番目の要素を文字列として取得したい。次に、arrayStringのインデックスに対応する文字列でインデックスを置き換えます。以下のような出力が必要です。

+---+---------------+
|id |replacedString |
+---+---------------+
|2  |Str1,Str3      |
|1  |Str2,Str4,Str3 |
|0  |Str1,Str2,Str3 |
+---+---------------+

以下のudf関数を使用してみました。

 val replaceIndex = udf((itemIndex: String, arrayString: Seq[Seq[String]]) => {
      val itemIndexArray = itemIndex.split("\\,")
    arrayString.map(i => {
      itemIndexArray.updated(i(0).toInt,i(1))
    })
    itemIndexArray
  })

これによりエラーが発生し、希望する出力が得られません。これを達成する他の方法はありますか。順序を失わずにインデックスを文字列で置き換えたいので、爆発と結合は使用できません。

回答 1 件
  • udf を作成できます  必要な結果を得るために以下のように、 array の配列に変換します   map へ   map のキーとしてインデックスを見つける 。

    val replaceIndex = udf((itemIndex: String, arrayString: Seq[Seq[String]]) => {
      val indexList = itemIndex.split("\\,")
      val array = arrayString.map(x => (x(0) -> x(1))).toMap
      indexList map array mkString ","
    })
    dataframe.withColumn("arrayString", replaceIndex($"indexes", $"arrayString"))
    .show( false)
    
    

    出力:

    +---+-------+--------------+
    |id |indexes|arrayString   |
    +---+-------+--------------+
    |2  |1,3    |Str1,Str3     |
    |1  |2,4,3  |Str2,Str4,Str3|
    |0  |1,2,3  |Str1,Str2,Str3|
    +---+-------+--------------+
    
    

    お役に立てれば!

あなたの答え