将列拆分为多行

Split column into multiple rows

我正在使用 sparkml,我在 CSV 中有如下数据。第一个是电影名称,后面的值是收到的各种评级。评分数量会有所不同。

例如 泰坦尼克号,9,10,8,6,9 冰雪奇缘,8,8,8 汽车,6,7,8,5

我希望他们像 泰坦尼克号,9 泰坦尼克号,10 泰坦尼克号,8 泰坦尼克号,6 冰雪奇缘,8 冰雪奇缘,8 冰雪奇缘,8 汽车,6 汽车,7 汽车,8 汽车,5

知道如何解决这个问题。 我查看了 Explode 功能,但它在分隔符不同的情况下对我有所帮助,例如:Titanic,|9|10|8|6|9。这里的分隔符是一样的。

由于每部电影的评分数量可能不同,您应该以文本文件而不是 CSV 格式读取数据。假设你得到一个包含文件每一行的 DataFrame

val df = Seq(
  "Titanic,9,10,8,6,9",
  "Frozen,8,8,8",
  "Cars,6,7,8,5"
).toDF("line")

使用简单的 UDF 将每一行分成两部分,电影和评级。通过将限制参数设置为 2,我们确保仅在第一个分隔符 ,

处拆分
val splitLine = udf { s : String => s.split(",", 2) }

然后拆分爆率

df.withColumn("mr", splitLine($"line"))
  .select(
    $"mr"(0).as("movie"), 
    explode(split($"mr"(1), ",")).as("rating")
  )

这给出了预期的输出

+-------+------+
|  movie|rating|
+-------+------+
|Titanic|     9|
|Titanic|    10|
|Titanic|     8|
|Titanic|     6|
|Titanic|     9|
| Frozen|     8|
| Frozen|     8|
| Frozen|     8|
|   Cars|     6|
|   Cars|     7|
|   Cars|     8|
|   Cars|     5|
+-------+------+