Spark: удаление первого массива из вложенного массива в Scala

#arrays #scala #dataframe #apache-spark #nested

#массивы #scala #фрейм данных #apache-spark #вложенный

Вопрос:

У меня есть фрейм данных с 2 столбцами.Я хочу удалить первый массив вложенного массива в каждой записи. Пример:- У меня есть DF, подобный этому

  --- ------- -------- ----------- ------------- 
|id |arrayField                                |
 --- ------------------------------------------ 
|1  |[[Akash,Kunal],[Sonu,Monu],[Ravi,Kishan]] |
|2  |[[Kunal, Mrinal],[Priya,Diya]]            |
|3  |[[Adi,Sadi]]                              |
 --- ------- --------- ---------- ------------- 
  

и я хочу, чтобы мой вывод выглядел следующим образом:-

  --- ------- ------ ------ ------- 
|id |arrayField                   |
 --- ----------------------------- 
|1  |[[Sonu,Monu],[Ravi,Kishan]]  |
|2  |[[Priya,Diya]]               |
|3  | null                        |
 --- ------- ------ ------ ------- 
  

Ответ №1:

Из Spark-2.4 используйте slice функцию.

Example:

 df.show(10,false)
/*
 ------------------------ 
|arrayField              |
 ------------------------ 
|[[A, k], [s, m], [R, k]]|
|[[k, M], [c, z]]        |
|[[A, b]]                |
 ------------------------ 
*/

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

df.withColumn("sliced",expr("slice(arrayField,2,size(arrayField))")).
withColumn("arrayField",when(size(col("sliced"))==0,lit(null)).otherwise(col("sliced"))).
drop("sliced").
show()
/*
 ---------------- 
|      arrayField|
 ---------------- 
|[[s, m], [R, k]]|
|        [[c, z]]|
|            null|
 ---------------- 
*/