如何填充地图[串,据框]作为列在一个数据框在卡拉

0

的问题

我有一个 Map[String, Dataframe]. 我要把所有的内部数据映射入一个单一的数据框. 可以据框有一个列的地图的数据类型?

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

+---------------------------------------------------------------------------------------+
| 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"}]  |
+---------------------------------------------------------------------------------------+
apache-spark dataframe dictionary scala
2021-11-23 13:42:20
2

最好的答案

1

你是要产生一个行每据框. 小心,如果其中一个数据帧足够大,以便它不能被包含在一个单一的遗嘱执行人,这个代码会破裂。

让我们首先产生数据和地图 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 associates的每个列名的数据框其价值(铸字符串中有一个一致的类型)。 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}]|
+---+-----------------------------------------------------------------------------------+
2021-11-24 07:05:52
0

这里是一个解决方案的具体使用情况:

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))

火花届会议需要创造空数据框蓄折。

或者如果你可以保证 Map 不是空的。

def sample(dfs : Map[String, DataFrame]): DataFrame =
  dfs
    .values
    .reduce((acc, df) => acc.union(df))
2021-11-23 14:30:01

可以请你查查这个问题我已经加入的一个例子。每个输入数据框我得到有差异的架构所以,我希望数据的整个输入数据框填充柱,所以我输出数据框有数据的每个输入数据框在一个柱
minnu

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................