【问题标题】:Update dataset in spark-shell by breaking one element into multiple parts and inserting a row for each part通过将一个元素分成多个部分并为每个部分插入一行来更新 spark-shell 中的数据集
【发布时间】:2017-09-25 20:55:37
【问题描述】:

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

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 实现这一目标的最佳方法是什么。

【问题讨论】:

  • 你需要的是explode函数。

标签: scala apache-spark spark-dataframe amazon-emr apache-spark-dataset


【解决方案1】:

对于您的用例,您必须同时使用 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 |
+-----------+------+----+----+

我希望这会有所帮助!

【讨论】:

  • 谢谢。那很有帮助。我现在有一个新问题。假设对于新创建的行,我想保留一列具有特定值,而其他列具有其他值。在您的结果图中,假设 col3 是值为 10 的整数。因此,在三行中,首先我希望 row1 的 col3 为 10,row2 和 row3 为 0。你会怎么做。
  • @AnantKumar 不客气!啊..对于您的第二种情况,您能告诉我基于哪一行获得值 10 和其他 0 的条件吗?
  • 只有第一行的值为 10,其他所有的值为 0。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
  • 2020-07-10
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多