通过将一个元素分成多个部分并为每个部分插入一行来更新 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 实现此目的的最佳方法是什么。
对于您的用例,您必须同时使用 split
和 explode
(如 @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 |
+-----------+------+----+----+
希望对您有所帮助!
我有一个将数据存储到数据集中的用例。我有一列,我可以在一行中使用管道 (|) 分隔的多个值。因此,典型的行如下所示:
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 实现此目的的最佳方法是什么。
对于您的用例,您必须同时使用 split
和 explode
(如 @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 |
+-----------+------+----+----+
希望对您有所帮助!