使用scala ad spark将数组中的元素分配到同一Dataframe中

brgchamk  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(325)

我输入一个数组,然后我想得到它们的unicode并存储到一个Dataframe中。这是我的密码

def getUnicodeOfEmoji (emojiArray : Array[String]) : DataFrame = {
    val existingSparkSession = SparkSession.builder().getOrCreate()
    import existingSparkSession.implicits._
    var result: DataFrame = null
    var df : DataFrame = null
    for (i <- 0 until emojiArray.length) {

      df = Seq(emojiArray(i)).toDF("emoji")

      df.show()

      result = df.selectExpr(
        "emoji",
        "'U+' || trim('0' , string(hex(encode(emoji, 'utf-32')))) as result"
      )

    }
    result.show(false)
    return result
  }

}

input = val emojis="???"

实际产量

|emoji|result |
+-----+-------+
|?   |U+1F60D|
+-----+-------+

但是我需要在Dataframe中包含所有3个emoji及其特定的unicode。

jyztefdp

jyztefdp1#

构建Dataframe不需要for循环。可以将数组转换为 Seq 使用 toDF a方法 Seq 构造生成的Dataframe。

def getUnicodeOfEmoji (emojiArray : Array[String]) : DataFrame = {
    val existingSparkSession = SparkSession.builder().getOrCreate()
    import existingSparkSession.implicits._
    val df = emojiArray.toSeq.toDF("emoji")
    val result = df.selectExpr(
        "emoji",
        "'U+' || trim('0' , string(hex(encode(emoji, 'utf-32')))) as result"
    )
    result.show(false)
    return result
  }

val emojis = "???"
val input = raw"\p{block=Emoticons}".r.findAllIn(emojis).toArray
val converted = getUnicodeOfEmoji(input)
+-----+-------+
|emoji|result |
+-----+-------+
|?   |U+1F603|
|?   |U+1F61C|
|?   |U+1F60D|
+-----+-------+

一个小小的改进是将你的表情串转换成 Seq[String] 直接输入函数之前,例如。

def getUnicodeOfEmoji (emojiArray : Seq[String]) : DataFrame = {
    val existingSparkSession = SparkSession.builder().getOrCreate()
    import existingSparkSession.implicits._
    val df = emojiArray.toDF("emoji")
    val result = df.selectExpr(
        "emoji",
        "'U+' || trim('0' , string(hex(encode(emoji, 'utf-32')))) as result"
    )
    result.show(false)
    return result
  }

val emojis = "???"
val input = raw"\p{block=Emoticons}".r.findAllIn(emojis).toSeq
val converted = getUnicodeOfEmoji(input)

相关问题