วิธี populate แผนที่[ข้อความ,Dataframe]ตอนเป็นคอลัมน์ใน Dataframe ใน language

0

คำถาม

ฉันมี Map[String, Dataframe]. ฉันต้องการจะรวมข้อมูลทั้งหมดอยู่ในนั้นแผนที่เป็นเดี่ยว Dataframe. สามารถเป็น dataframe มีคอลัมน์ของแผนที่ datatype?

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 

ฉันส่งที่อยู่เหนือสอง DFs เป็นแผนที่ต้องฟังก์ชัน. งั้นเอาข้อมูลของแต่ละ dataframes ให้เป็นโสดคอลัมน์ของผลส่งออก dataframe เป็น language รูปแบบ

ออกไป 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

คุณกำลังสร้างหนึ่งแถวต่อ dataframe. ระวังหน่อยนะถ้าใครคนใดคนหนึ่งของ dataframes ใหญ่พอแล้วนั่นมันไม่สามารถยอมให้ถูกควบคุมหรอยู่คนเดียว executor,ดรหัสนี้จะพักหน่อย

ปล่อยให้เป็นก่อสร้างข้อมูลและแผนที่ 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)

แล้วสำหรับแต่ละ dataframe ของแผนที่ที่เราสร้างสองคนคอลัมน์. big_map เพื่อนร่วมงางแต่ละคอลัมน์ชื่อของ dataframe งค่า(แสดงอยู่ในข้อความมีสอดคล้องพิมพ์). df เพียงบรรจุชื่อของ dataframe. เราแล้วสหภาพทั้งหมด dataframes กับ reduce และจัดกลุ่มตาม name (มันเป็นแค่ส่วนเสี้ยวที่เห็นอยู่ไหนทุก dataframe ต้องทั้งหมดในหนึ่งแถวและดังนั้นคนหนึ่ง executor).

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

จุดกลุ่มงานคือต้องการที่จะสร้างว่างเปล่า DataFrame accumulator ต้องหรือจะเรียกว่าอดีตจนท.บ.

อีกทางเลือกถ้าคุณสามารถรับรองได้ว่า Map คือไม่ว่างเปล่า

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

คุณสามารถโปรดตรวจสอบคำถามฉันต้องถูกเพิ่มเป็นตัวอย่างตอนนี้แต่ละนำเข้าข้อมูล dataframe ซึ่งฉันได้มีคำสั่ง diff schemas ดังนั้นฉันต้องการข้อมูลของทั้งหมดข้อมูล dataframe จะ populated เป็นคอลัมน์ดังนั้นของผลส่งออก dataframe มีข้อมูลของแต่ละค่า dataframe ในคอลัมน์
minnu

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่