Spark 将单列转换为数组

Geo*_*ler 7 scala apache-spark apache-spark-sql

如何将 Spark 2.0.1 中的单个列转换为数组?

+---+-----+
| id| dist| 
+---+-----+
|1.0|2.0|
|2.0|4.0|
|3.0|6.0|
|4.0|8.0|
+---+-----+
Run Code Online (Sandbox Code Playgroud)

应该返回Array(1.0, 2.0, 3.0, 4.0)

A

import scala.collection.JavaConverters._ 
df.select("id").collectAsList.asScala.toArray
Run Code Online (Sandbox Code Playgroud)

失败了

java.lang.RuntimeException: Unsupported array type: [Lorg.apache.spark.sql.Row;
java.lang.RuntimeException: Unsupported array type: [Lorg.apache.spark.sql.Row;
Run Code Online (Sandbox Code Playgroud)

che*_*aux 9

如果您将 Java 列表重新转换为 Scala 列表,为什么还要使用 JavaConverters 呢?您只需要收集数据集,然后将这个行数组映射到双精度数组,如下所示:

df.select("id").collect.map(_.getDouble(0))
Run Code Online (Sandbox Code Playgroud)

  • 数据帧上的“collect()”不是一种可扩展的方式。 (4认同)
  • 谁在这里谈论了可扩展性? (4认同)

mrs*_*vas 6

我会尝试使用数据帧聚合函数 -collect_list()来避免驱动程序 JVM 上的内存开销。通过这种方法,只有选定的列值才会被复制到驱动程序 JVM

df.select(collect_list("id")).first().getList[Double](0)
Run Code Online (Sandbox Code Playgroud)

这样就返回了java.util.List[Double]