Как выполнить одно горячее кодирование в Spark для строкового столбца, который имеет значения, разделенные запятыми? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть фрейм данных, который выглядит так *

Можно ли сделать это с помощью однократного кодирования в Spark?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Столбец "page_path" может быть разделен, а затем значения взорваны и развернуты:

 df
  .withColumn("splitted", split($"page_path",","))
  .withColumn("exploded", explode($"splitted"))
  .groupBy("id")
  .pivot("exploded")
  .count()
  // replace nulls with 0
  .na.fill(0)

Вывод:

+---+---+---+---+
|id |a  |b  |c  |
+---+---+---+---+
|1  |1  |1  |1  |
|2  |0  |1  |1  |
+---+---+---+---+
0 голосов
/ 20 апреля 2020
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._

object Solution {

  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[4]").setAppName("SparkClusterApp")
    val sparkSession = SparkSession.builder.config(sparkConf).getOrCreate

    import sparkSession.implicits._

    val df = Seq((1, "a,b,c"),(2, "b,c")).toDF("id", "page_path")
    df.createOrReplaceTempView("df")
    df.withColumn("_tmp", split($"page_path", "\\,")).select( $"id",
      when(array_contains($"_tmp","a"),"1").otherwise("0").as("is_a"),
      when(array_contains($"_tmp","b"),"1").otherwise("0").as("is_b"),
      when(array_contains($"_tmp","c"),"1").otherwise("0").as("is_c")).show()
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...