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