Cara mengonversi kerangka data percikan ke daftar struct di scala

Saya memiliki kerangka data percikan yang terdiri dari 12 baris dan kolom berbeda, dalam hal ini 22.

Saya ingin mengubahnya menjadi kerangka data dengan format:

root
 |-- data: array (nullable = false)
 |    |-- element: struct (containsNull = false)
 |    |    |-- ast: double (nullable = true)
 |    |    |-- blk: double (nullable = true)
 |    |    |-- dreb: double (nullable = true)
 |    |    |-- fg3_pct: double (nullable = true)
 |    |    |-- fg3a: double (nullable = true)
 |    |    |-- fg3m: double (nullable = true)
 |    |    |-- fg_pct: double (nullable = true)
 |    |    |-- fga: double (nullable = true)
 |    |    |-- fgm: double (nullable = true)
 |    |    |-- ft_pct: double (nullable = true)
 |    |    |-- fta: double (nullable = true)
 |    |    |-- ftm: double (nullable = true)
 |    |    |-- games_played: long (nullable = true)
 |    |    |-- seconds: double (nullable = true)
 |    |    |-- oreb: double (nullable = true)
 |    |    |-- pf: double (nullable = true)
 |    |    |-- player_id: long (nullable = true)
 |    |    |-- pts: double (nullable = true)
 |    |    |-- reb: double (nullable = true)
 |    |    |-- season: long (nullable = true)
 |    |    |-- stl: double (nullable = true)
 |    |    |-- turnover: double (nullable = true)

Di mana setiap elemen bidang kerangka data data sesuai dengan baris berbeda dari kerangka data asli.

Tujuan akhirnya adalah mengekspornya ke file .json yang berformat:

{"data": [{row1}, {row2}, ..., {row12}]}

Kode yang saya gunakan saat ini adalah sebagai berikut:

val best_12_struct = best_12.withColumn("data", array((0 to 11).map(i => struct(col("ast"), col("blk"), col("dreb"), col("fg3_pct"), col("fg3a"), 
                                                                   col("fg3m"), col("fg_pct"), col("fga"), col("fgm"), 
                                                                   col("ft_pct"), col("fta"), col("ftm"), col("games_played"), 
                                                                   col("seconds"), col("oreb"), col("pf"), col("player_id"), 
                                                                   col("pts"), col("reb"), col("season"), col("stl"), col("turnover"))) : _*))
            
val best_12_data = best_12_struct.select("data")

Tapi array(0 to 11) menyalin 12 kali elemen yang sama ke data. Oleh karena itu, .json yang akhirnya saya peroleh memiliki 12 {"data": ...}, berada di setiap baris yang sama disalin 12 kali, bukan hanya satu {"data": ...} dengan 12 elemen, masing-masing sesuai dengan satu baris kerangka data asli.


person Fernando García Sanz    schedule 20.10.2020    source sumber
comment
dapatkah Anda menambahkan data sampel dan keluaran yang diharapkan di json ??   -  person Srinivas    schedule 21.10.2020


Jawaban (1)


Anda memiliki 12 kali baris yang sama karena metode withColumn hanya akan mengambil informasi dari baris yang dirawat saat ini.

Anda perlu menggabungkan baris pada tingkat kerangka data dengan collect_list yaitu fungsi agregat sebagai berikut:

import org.apache.spark.sql.functions._

val best_12_data = best_12
  .withColumn("row", struct(col("ast"), col("blk"), col("dreb"), col("fg3_pct"), col("fg3a"), col("fg3m"), col("fg_pct"), col("fga"), col("fgm"), col("ft_pct"), col("fta"), col("ftm"), col("games_played"), col("seconds"), col("oreb"), col("pf"), col("player_id"), col("pts"), col("reb"), col("season"), col("stl"), col("turnover")))
  .agg(collect_list(col("row")).as("data"))
person Vincent Doba    schedule 21.10.2020