将列拆分为多行

时间:2018-11-04 16:38:54

标签: apache-spark apache-spark-mllib

我正在使用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),它对我有帮助。这里的定界符是相同的。

1 个答案:

答案 0 :(得分:1)

由于每部电影的分级数量可能会有所不同,因此您应该将数据读取为textFile,而不是CSV。假设您获得一个包含文件每一行的DataFrame

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

使用简单的UDF将每一行分为电影和收视率两部分。通过将limit参数设置为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|
+-------+------+