Map[string,Dataframe] ' i scala'daki bir Dataframe'de sütun olarak nasıl doldurabilirim

0

Soru

Benim var Map[String, Dataframe]. Bu Haritanın içindeki tüm verileri tek bir Veri Çerçevesine birleştirmek istiyorum. Bir veri çerçevesinin bir Harita veri türü sütunu olabilir mi?

def sample(dfs : Map[String,Dataframe]): Dataframe =
{
.........
}

Örnek:

DF1

id name age
1  aaa  23
2  bbb  34

DF2

game  time  score
ludo  10    20
rummy 30    40 

Yukarıdaki iki dfs'yi işleve Harita olarak iletiyorum. Ardından, her veri çerçevesinin verilerini, çıktı veri çerçevesinin tek bir sütununa json biçimi olarak yerleştirin.

dışarı 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

En iyi cevabı

1

Veri çerçevesi başına bir satır oluşturmak istiyorsunuz. Dikkatli olun, veri çerçevelerinden biri tek bir yürütücüde bulunamayacak kadar büyükse, bu kod kırılır.

Önce verileri ve haritayı oluşturalım dfs tür 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)

Ardından, haritanın her veri çerçevesi için iki sütun oluştururuz. big_map dataframe'in her sütun adını değeriyle ilişkilendirir (tutarlı bir türe sahip olmak için dizeye dökülür). df sadece veri çerçevesinin adını içerir. Sonra tüm dataframes Birliği biz reduce ve gruplandır name (bu, her bir veri çerçevesinin tamamen bir satırda ve dolayısıyla bir yürütücüde bittiği kısımdır).

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

İşte kullanım durumunuza özgü bir çözüm:

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

Kıvılcım oturumu, katlanacak boş DataFrame akümülatörünü oluşturmak için gereklidir.

Alternatif olarak, garanti edebilirseniz Map sigara boş.

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

şu anda bir örnek eklediğim soruyu kontrol edebilir misiniz?Aldığım her giriş veri çerçevesinin farklı şemaları vardır, bu nedenle tüm giriş veri çerçevesinin verilerinin bir sütun olarak doldurulmasını istiyorum, böylece çıkış veri çerçevem her giriş veri çerçevesinin verilerini bir sütunda barındırıyor
minnu

Diğer dillerde

Bu sayfa diğer dillerde

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