簡體   English   中英

使用Scala將多列轉換為Spark Dataframe上的一列地圖

[英]Convert multiple columns into a column of map on Spark Dataframe using Scala

我有一個具有可變列數的數據框,如 Col1、Col2、Col3。 我需要使用下面的代碼將 Col1 和 Col2 合並到一列數據類型映射中。

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

但是,當我不知道列的編號和名稱時,如何對所有列執行此操作?

另一種方法是使用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]|
+---+---+---+---+------------------------------------+

一種方法是通過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)|
// +---+---+---+---+---------------------------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM