Scala Spark collect_list() против array()

#scala #apache-spark

#scala #apache-spark

Вопрос:

В чем разница между collect_list() и array() в spark с использованием scala?

Я вижу использование повсюду, и варианты использования мне непонятны, чтобы определить разницу.

Ответ №1:

Несмотря на то, что оба array и collect_list возвращают ArrayType столбец, эти два метода сильно отличаются.

Метод array объединяет «по столбцам» несколько столбцов в массив, тогда как collect_list агрегирует «по строкам» в одном столбце, обычно по группам (или Window разделам) в массив, как показано ниже:

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

val df = Seq(
  (1, "a", "b"),
  (1, "c", "d"),
  (2, "e", "f")
).toDF("c1", "c2", "c3")

df.
  withColumn("arr", array("c2", "c3")).
  show
//  --- --- --- ------ 
// | c1| c2| c3|   arr|
//  --- --- --- ------ 
// |  1|  a|  b|[a, b]|
// |  1|  c|  d|[c, d]|
// |  2|  e|  f|[e, f]|
//  --- --- --- ------ 

df.
  groupBy("c1").agg(collect_list("c2")).
  show
//  --- ---------------- 
// | c1|collect_list(c2)|
//  --- ---------------- 
// |  1|          [a, c]|
// |  2|             [e]|
//  --- ----------------