当前位置: 首页 > 知识库问答 >
问题:

火花:将多列分解成一列

彭畅
2023-03-14

是否有可能在火花中将多个列爆炸成一个新列?我有一个如下所示的数据框:

userId         varA     varB
   1         [0,2,5]   [1,2,9]

期望输出:

userId     bothVars
   1         0     
   1         2     
   1         5  
   1         1  
   1         2  
   1         9  

到目前为止,我尝试过:

val explodedDf = df.withColumn("bothVars", explode($"varA")).drop("varA")
                   .withColumn("bothVars", explode($"varB")).drop("varB")

这不起作用。非常感谢您的任何建议。

共有2个答案

宋涵衍
2023-03-14

使用array_union,然后使用爆炸函数

scala> df.show(false)
+------+---------+---------+
|userId|varA     |varB     |
+------+---------+---------+
|1     |[0, 2, 5]|[1, 2, 9]|
|2     |[1, 3, 4]|[2, 3, 8]|
+------+---------+---------+
scala> df
.select($"userId",explode(array_union($"varA",$"varB")).as("bothVars"))
.show(false)

+------+--------+
|userId|bothVars|
+------+--------+
|1     |0       |
|1     |2       |
|1     |5       |
|1     |1       |
|1     |9       |
|2     |1       |
|2     |3       |
|2     |4       |
|2     |2       |
|2     |8       |
+------+--------+

array_union在 Spark 2.4 中可用

钮勇
2023-03-14

您可以将两个数组包装成一个,并在爆炸嵌套数组之前将展平,如下所示:

val df = Seq(
  (1, Seq(0, 2, 5), Seq(1, 2, 9)),
  (2, Seq(1, 3, 4), Seq(2, 3, 8))
).toDF("userId", "varA", "varB")

df.
  select($"userId", explode(flatten(array($"varA", $"varB"))).as("bothVars")).
  show
// +------+--------+
// |userId|bothVars|
// +------+--------+
// |     1|       0|
// |     1|       2|
// |     1|       5|
// |     1|       1|
// |     1|       2|
// |     1|       9|
// |     2|       1|
// |     2|       3|
// |     2|       4|
// |     2|       2|
// |     2|       3|
// |     2|       8|
// +------+--------+

请注意,< code>flatten在Spark 2.4上可用。

 类似资料:
  • 如何将多个列对分解为多行? 我有一个包含以下内容的数据帧 我想要一个最终的数据帧,如下所示 我试着使用下面的代码,但是它返回了4条记录,而不是我想要的两条记录

  • 我有一个包含多列的数据框架: 我现在想将组合成一列。但是,我不知道列列表会有多大,否则我可以使用UDF3来组合这三个。 所以期望的结果是: 我怎样才能实现这一点? 不工作的伪代码: 最坏的解决方法是对输入列的数量执行switch语句,然后为每个输入列编写一个UDF,即2-20个输入列,如果提供了更多的输入列,则抛出一个错误。

  • 我有一个spark工作,处理大量数据并将结果写入S3。在处理过程中,我可能有超过5000个分区。在写入S3之前,我想减少分区的数量,因为每个分区都是作为一个文件写入的。 在其他一些情况下,处理过程中可能只有50个分区。如果我想合并而不是因为性能原因重新分区,会发生什么。 从文档来看,它说只有当输出分区的数量少于输入时才应该使用coalesce,但是如果不是,它似乎不会导致错误吗?它会导致数据不正确

  • 我有RDD,其中每个记录都是int: 我所需要做的就是将这个RDD拆分成批。即。制作另一个RDD,其中每个元素都是固定大小的元素列表: 这听起来微不足道,然而,最近几天我很困惑,除了下面的解决方案之外,什么也找不到: > 使用ZipWithIndex枚举RDD中的记录: 这将得到我所需要的,然而,我不想在这里使用组。当您使用普通映射Reduce或一些抽象(如Apache Crunch)时,它是微不

  • 一些脚本在工作时什么也不做,当我手动运行它们时,其中一个失败了,出现了以下消息: 错误SparkUI:未能绑定SparkUI java.net.bindexception:地址已在使用:服务“SparkUI”在重试16次后失败! 所以我想知道是否有一种特定的方法来并行运行脚本?

  • 我有一个列,其中包含该列的名称和值,格式如下: 我不想使用上面的设置,而是希望按以下格式排列列: 问题是这些值在整个列中并不一致,有时我会有这些值的组合,有时没有,有时只有一个,但顺序如何并不重要,所有这些列都必须创建。怎样才能用一种通用的方式调用它们,而不用像这样指定值: