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

火花 Java - 将多个列收集到数组列中

吴子昂
2023-03-14

我有一个包含多列的数据框架:

| a | b | c | d |
-----------------
| 0 | 4 | 3 | 6 |
| 1 | 7 | 0 | 4 |
| 2 | 4 | 3 | 6 |
| 3 | 9 | 5 | 9 |

我现在想将[b, c, d]组合成一列。但是,我不知道列列表会有多大,否则我可以使用UDF3来组合这三个。

所以期望的结果是:

| a | combined  |
-----------------
| 0 | [4, 3, 6] |
| 1 | [7, 0, 4] |
| 2 | [4, 3, 6] |
| 3 | [9, 5, 9] |

我怎样才能实现这一点?

不工作的伪代码:

public static Dataset<Row> mergeColumns(Dataset<Row> ds, List<String> columns) {
   return ds.withColumn("combined", collectAsList(columns))
}

最坏的解决方法是对输入列的数量执行switch语句,然后为每个输入列编写一个UDF,即2-20个输入列,如果提供了更多的输入列,则抛出一个错误。

共有2个答案

冉永宁
2023-03-14
val newDF = df.drop("a")

//create a new dataframe to get the combination of columns except the first column
val df2 = df.withColumn("combined", concat_ws(",",newDF.columns.map(collist => 
col(collist)): _*))

//new dataframe to select only the first and combined columns
val columnNames = Seq("a", "combined")
df2.select(columnNames.head, columnNames.tail:_*).show()
程景胜
2023-03-14

正如Ramesh在他的评论中提到的,你可以使用< code>array函数。您只需要将列列表转换为< code>Column数组。

public static Dataset<Row> mergeColumns(Dataset<Row> ds, List<String> columns) {
    return ds.withColumn("combined", functions.array(columns.stream().map(functions::col).toArray(Column[]::new)))
}
 类似资料:
  • 我有以下Apache Spark数据帧(DF1): 首先,我想按对DataFrame进行分组,将结果收集到中并接收新的DataFrame(DF2): 之后,我需要收集到通过分组,我将收到如下所示的新DataFrame(DF3): 所以,我有一个问题 - 首先,我可以在阿帕奇火花中使用按数组类型列分组吗?如果是这样,我可能会在 单个字段中result_list数千万个值。在这种情况下,阿帕奇火花是否

  • 是否有可能在火花中将多个列爆炸成一个新列?我有一个如下所示的数据框: 期望输出: 到目前为止,我尝试过: 这不起作用。非常感谢您的任何建议。

  • 如何使用将多个值收集到一个列表中? 因为我对接口有完全的控制权:还是应该更改方法以返回数组而不是列表?

  • 我有两个包含两列的DataFrames > <code>df1</code>,带有架构<code>(键1:长,值)</code> <code>df2</code>,带架构<code>(键2:数组[Long],值)</code> 我需要在键列上连接这些DataFrames(查找和中的值之间的匹配值)。但问题是它们的类型不同。有办法做到这一点吗?

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

  • 我们正试图在spark中生成数据集的逐列统计数据。除了使用统计库中的summary函数之外。我们使用以下程序: > 我们确定具有字符串值的列 为整个数据集生成键值对,使用列号作为键,使用列的值作为值 生成新的格式映射 (K,V)- 然后我们使用reduceByKey来找到所有列中所有唯一值的总和。我们缓存这个输出以减少进一步的计算时间。 在下一步中,我们使用for循环遍历列,以查找所有列的统计信息