如何将逗号分隔的多列拆分为多行?

用户名

我有一个带有N个字段的数据框,如下所述。列数和值的长度将有所不同。

输入表:

+--------------+-----------+-----------------------+
|Date          |Amount     |Status                 |
+--------------+-----------+-----------------------+
|2019,2018,2017|100,200,300|IN,PRE,POST            |
|2018          |73         |IN                     |
|2018,2017     |56,89      |IN,PRE                 |
+--------------+-----------+-----------------------+

我必须使用一个序列列将其转换为以下格式。

预期输出表:

+-------------+------+---------+
|Date  |Amount|Status| Sequence|
+------+------+------+---------+
|2019  |100   |IN    |   1     |
|2018  |200   |PRE   |   2     |
|2017  |300   |POST  |   3     |
|2018  |73    |IN    |   1     |
|2018  |56    |IN    |   1     |
|2017  |89    |PRE   |   2     |
+-------------+------+---------+

我尝试过使用爆炸,但一次只能爆炸一个数组。

var df = dataRefined.withColumn("TOT_OVRDUE_TYPE", explode(split($"TOT_OVRDUE_TYPE", "\\"))).toDF

var df1 = df.withColumn("TOT_OD_TYPE_AMT", explode(split($"TOT_OD_TYPE_AMT", "\\"))).show 

有人知道我该怎么做吗?感谢您的帮助。

复活

这是对每一列使用posexplode并将所有产生的数据帧合并为一个的另一种方法:

导入org.apache.spark.sql.functions。{posexplode,monotonically_increasing_id,col}

val df = Seq(
  (Seq("2019", "2018", "2017"), Seq("100", "200", "300"), Seq("IN", "PRE", "POST")),
  (Seq("2018"), Seq("73"), Seq("IN")),
  (Seq("2018", "2017"), Seq("56", "89"), Seq("IN", "PRE")))
.toDF("Date","Amount", "Status")
.withColumn("idx", monotonically_increasing_id)

df.columns.filter(_ != "idx").map{
  c => df.select($"idx", posexplode(col(c))).withColumnRenamed("col", c)
}
.reduce((ds1, ds2) => ds1.join(ds2, Seq("idx", "pos")))
.select($"Date", $"Amount", $"Status", $"pos".plus(1).as("Sequence"))
.show

输出:

+----+------+------+--------+
|Date|Amount|Status|Sequence|
+----+------+------+--------+
|2019|   100|    IN|       1|
|2018|   200|   PRE|       2|
|2017|   300|  POST|       3|
|2018|    73|    IN|       1|
|2018|    56|    IN|       1|
|2017|    89|   PRE|       2|
+----+------+------+--------+

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将逗号分隔的字符串拆分为空字符串数组

如何将逗号分隔的值拆分为列

AngularJS如何将列表动态拆分为多列

将逗号分隔的列中的值拆分为Sql Server中的多行

如何将包含多个值(以逗号分隔)的单元格拆分为单独的行?

根据值将一列逗号分隔的数字拆分为多列

如何将以管道分隔的列拆分为多行?

如何将逗号和分号分隔的字符串拆分为JSON对象

如何将多列分组为逗号分隔的输出

如何将一列拆分为多列?

如何将逗号分隔的值拆分为其他列

如何将熊猫意甲拆分为两列(用逗号分隔)

Pyspark:如何将以管道分隔的列拆分为多行?

如何将一列拆分为逗号分隔的字符串?

在EXCEL中将1列内容(逗号分隔)拆分为多行

如何将单行列拆分为多行和多列?

如何将多值、字符分隔的列拆分为多行?

将逗号分隔的字符串拆分为列

如何将 MySQL 中的逗号分隔值拆分为行?

将逗号分隔值拆分为多行

将逗号分隔的值拆分为多行 - Oracle SQL

如何将逗号分隔的部分列表元素拆分为新列表?

将逗号分隔的值拆分为多列

在每个逗号分隔后将数字字符串列拆分为多列

如何使用 connect by 将逗号分隔的值拆分为列

当使用 PySpark 在列中以逗号分隔时,如何将列拆分为自己的行?

如何将逗号分隔的文本拆分为熊猫数据框上的列?

将逗号分隔的列拆分为许多熊猫

如何将列值拆分为多列熊猫