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

使用Scala将Spark Dataframe上的多列转换为一列map

颜新
2023-03-14

我有一个数据帧,它有可变数量的列,如Col1,Col2,Col3。我需要使用下面的代码将Col1和Col2合并到一列数据类型映射中。

val df_converted = df.withColumn("ConvertedCols", map(lit("Col1"), col("Col1"), lit("Col2"), col("Col2")))

但是在不知道列的数量和名称的情况下,如何对所有的列都这样做呢?

共有2个答案

姬旭
2023-03-14

另一种方法是使用from_jsonto_json获取映射类型列:

val df2 = df.withColumn(
    "ConvertedCols", 
    from_json(to_json(struct("*")), lit("map<string,string>"))
)

df2.show(false)
+---+---+---+---+------------------------------------+
|c1 |c2 |c3 |c4 |ConvertedCols                       |
+---+---+---+---+------------------------------------+
|a  |b  |c  |d  |[c1 -> a, c2 -> b, c3 -> c, c4 -> d]|
|e  |f  |g  |h  |[c1 -> e, c2 -> f, c3 -> g, c4 -> h]|
+---+---+---+---+------------------------------------+
勾学博
2023-03-14

一种方法是通过flatMap将DataFrame的列列表扩展为Seq(lit(c1),col(c1),lit(c2),col(c2)…)并应用Spark的映射,如下所示:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = Seq(
  ("a", "b", "c", "d"),
  ("e", "f", "g", "h")
).toDF("c1", "c2", "c3", "c4")

val kvCols = df.columns.flatMap(c => Seq(lit(c), col(c)))

df.withColumn("ConvertedCols", map(kvCols: _*)).show(false)
// +---+---+---+---+---------------------------------------+
// |c1 |c2 |c3 |c4 |ConvertedCols                          |
// +---+---+---+---+---------------------------------------+
// |a  |b  |c  |d  |Map(c1 -> a, c2 -> b, c3 -> c, c4 -> d)|
// |e  |f  |g  |h  |Map(c1 -> e, c2 -> f, c3 -> g, c4 -> h)|
// +---+---+---+---+---------------------------------------+
 类似资料:
  • 我想使用spark dataframe将行转换为列。 我的桌子是这样的 我想把它转换成 我用了下面的代码:- 但我得到的结果是-- 任何人都可以帮助得到渴望的结果。

  • 问题内容: 我需要在Java中实现一个返回Scala的方法。 但是我遇到这个错误: 到目前为止,这是我的代码: 但似乎没有提供将其转换为的可能性。 问题答案: 我需要JavaConverters来解决这个问题。

  • 由于正在崩溃,如果传递的列有或以外的其他类型,并且我正在处理大量列,我想知道: 有没有一种简单的方法,一次强制转换多个列?

  • 问题内容: 我试图将字符串列表从我的Java控制器传递到scala模板。 这是视图代码: 这是临时代码: 我遇到的错误(在Typesafe Activation Compile页面中): 类索引中的render方法不能应用于给定的类型; 必需:scala.collection.immutable.List 找到:java.util.List 原因:实际参数java.util.List无法通过方法调

  • 鉴于 我有一个对象列表。 看起来像 我想将此转换为 i、 e.将个人类别整理成类别列表。 这是实现我想要的当前代码。 有什么方法可以使用流来做到这一点吗 这个问题在本质上类似于Group by和sum对象,比如SQLJavalambdas?但对我没有帮助,因为这里完成了聚合,而这里不是聚合。

  • 所以我的数据集有一些n个日期的位置信息。问题是每个日期实际上是不同的列标题。例如CSV看起来像 我想让它看起来像 我的问题是我不知道该列中有多少个日期(尽管我知道它们总是在name之后开始)