我有一个数据帧,它有可变数量的列,如Col1,Col2,Col3。我需要使用下面的代码将Col1和Col2合并到一列数据类型映射中。
val df_converted = df.withColumn("ConvertedCols", map(lit("Col1"), col("Col1"), lit("Col2"), col("Col2")))
但是在不知道列的数量和名称的情况下,如何对所有的列都这样做呢?
另一种方法是使用from_json
和to_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]|
+---+---+---+---+------------------------------------+
一种方法是通过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之后开始)