通过将一个元素分成多个部分并为每个部分插入一行来更新 spark-shell 中的数据集

Update dataset in spark-shell by breaking one element into multiple parts and inserting a row for each part

我有一个将数据存储到数据集中的用例。我有一列,我可以在一行中使用管道 (|) 分隔的多个值。因此,典型的行如下所示:

2016/01/01  1/XYZ   PQR M|N|O 

我想将这一行转换成3行如下:

2016/01/01  1/XYZ   PQR M
2016/01/01  1/XYZ   PQR N
2016/01/01  1/XYZ   PQR O

另外,并非最后一列的所有内容都可能包含竖线(|)。某些行可以是上述内容之一。我试图用管道 (|) 拆分相关列,但由于行不包含管道 (|) 而出现错误。我想不出任何进一步的解决方案。

在 scala 中使用 spark-shell 实现此目的的最佳方法是什么。

对于您的用例,您必须同时使用 splitexplode(如 @Pushkr 所述)。

df.withColumn("new", split($"col4", "[|:]+")).drop("col4").withColumn("col4", explode($"new")).drop("new").show

这里df是包含2016/01/01 1/XYZ PQR M|N|O数据的DataFrame。此外,要按任何分隔符拆分,您必须根据您的要求构建模式。就像上面的代码一样,我使用 [|:]+ 模式将字符串拆分为 |:.

例如:

2016/01/01,1/XYZ,PQR,M|N|O
2016/02/02,2/ABC,DEF,P:Q:R

将导致:

+-----------+------+----+----+
|       col1|  col2|col3|col4|
+-----------+------+----+----+
|2016/01/01 |1/XYZ |PQR |  M |
|2016/01/01 |1/XYZ |PQR |  N |
|2016/01/01 |1/XYZ |PQR |  O |
|2016/02/02 |2/ABC |DEF |  P |
|2016/02/02 |2/ABC |DEF |  Q |
|2016/02/02 |2/ABC |DEF |  R |
+-----------+------+----+----+

希望对您有所帮助!