Memelihara Lajur Lain Apabila Menghimpun dalam Spark DataFrame
Apabila melakukan operasi DataFrame mengikut kumpulan, adalah perkara biasa untuk menghadapi isu hanya menerima kumpulan lajur dan nilai agregat. Ini boleh menyusahkan jika anda perlu mengekalkan lajur lain daripada DataFrame asal.
Sebagai contoh, pertimbangkan kumpulan berikut:
df.groupBy(df("age")).agg(Map("id" -> "count"))
Ini akan mengembalikan DataFrame yang mengandungi hanya "umur" dan lajur "count(id)". Walau bagaimanapun, jika "nama" dan lajur lain wujud dalam DataFrame asal, anda mungkin mahu memasukkannya ke dalam hasilnya.
Dalam SQL standard, ini boleh dicapai menggunakan pertanyaan berikut:
select name, age, count(id) from df group by age
Untuk meniru tingkah laku ini dalam Spark, anda boleh menyertai hasil agregat dengan jadual asal. Lajur utama untuk gabungan hendaklah sama dengan lajur kumpulan mengikut.
Berikut ialah contoh menggunakan Spark SQL:
val groupedDf = df.groupBy($"age").agg(count($"id").as("count")) val joinedDf = df.join(groupedDf, Seq("age"), "left")
Df joined kini akan mengandungi semua lajur asal bersama-sama lajur "kiraan" teragregat.
Pendekatan lain ialah menggunakan agregat sewenang-wenangnya seperti pertama atau terakhir untuk memasukkan tambahan lajur. Contohnya:
val groupedDf = df.groupBy($"age").agg(first($"name").as("name"), count($"id").as("count"))
Ini akan memastikan bahawa lajur "nama" dikekalkan dalam DataFrame terkumpul.
Walaupun kaedah ini membenarkan anda mendapatkan semula lajur lain semasa pengumpulan, adalah penting untuk ambil perhatian bahawa pertanyaan sedemikian secara amnya tidak ditakrifkan dengan baik dan mungkin menunjukkan kelakuan yang berbeza-beza merentas sistem yang berbeza.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyimpan Lajur Lain Apabila Menghimpun dalam Spark DataFrame?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!