我有一個Map[String, Dataframe]. 我想將該 Map 中的所有資料組合到一個 Dataframe 中。資料框可以有一列 Map 資料型別嗎?
def sample(dfs : Map[String,Dataframe]): Dataframe =
{
.........
}
例子:
DF1
id name age
1 aaa 23
2 bbb 34
DF2
game time score
ludo 10 20
rummy 30 40
我將上述兩個 DF 作為 Map 傳遞給函式。然后將每個資料幀的資料以 json 格式放入輸出資料幀的單列中。
出DF
------ ---- ------ ---- ------ ---- ------ ---- ------ ---- ------ ------ ------ ------
| column1 |
------ ---- ------ ---- ------ ---- ------ ---- ------ ---- ------ ------ ------ ------
| [{"id":"1","name":"aaa","age":"23"},{"id":21","name":"bbb","age":"24"}] |
| [{"game":"ludo","time":"10","score":"20"},{"game":"rummy","time":"30","score":"40"}] |
------ ---- ------ ---- ------ ---- ------ ---- ------ ---- ------ ------ ------ ------
uj5u.com熱心網友回復:
這是特定于您的用例的解決方案:
import org.apache.spark.sql._
def sample(dfs : Map[String, DataFrame])(implicit spark: SparkSession): DataFrame =
dfs
.values
.foldLeft(spark.emptyDataFrame)((acc, df) => acc.union(df))
需要 spark 會話來創建要折疊的空 DataFrame 累加器。
或者,如果您可以保證Map不為空。
def sample(dfs : Map[String, DataFrame]): DataFrame =
dfs
.values
.reduce((acc, df) => acc.union(df))
uj5u.com熱心網友回復:
您要求為每個資料幀生成一行。請注意,如果其中一個資料幀足夠大以至于不能包含在一個單獨的執行程式中,則此代碼將中斷。
讓我們首先生成資料和dfs型別的地圖Map[String, DataFrame]。
val df1 = Seq((1, "aaa", 23), (2, "bbb", 34)).toDF("id", "name", "age")
val df2 = Seq(("ludo", 10, 20), ("rummy", 10, 40)).toDF("game", "time", "score")
dfs = Seq(df1, df2)
然后,對于地圖的每個資料框,我們生成兩列。big_map將資料框的每個列名與其值相關聯(轉換為字串以具有一致的型別)。df只包含資料框的名稱。然后我們將所有資料幀與reduce并分組name(這是每個資料幀完全在一行中結束的部分,因此一個執行器)。
dfs
.toSeq
.map{ case (name, df) => df
.select(map(
df.columns.flatMap(c => Seq(lit(c), col(c).cast("string"))) : _*
) as "big_map")
.withColumn("df", lit(name))}
.reduce(_ union _)
.groupBy("df")
.agg(collect_list('big_map) as "column1")
.show(false)
--- -----------------------------------------------------------------------------------
|df |column1 |
--- -----------------------------------------------------------------------------------
|df0|[{id -> 1, name -> aaa, age -> 23}, {id -> 2, name -> bbb, age -> 34}] |
|df1|[{game -> ludo, time -> 10, score -> 20}, {game -> rummy, time -> 10, score -> 40}]|
--- -----------------------------------------------------------------------------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/364793.html
