将列拆分为多行
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|
+-------+------+
我正在使用 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|
+-------+------+