首页 > 解决方案 > 使用地图计算数组列中的元素

问题描述

我有一个数据框,它只包含一个带有数组的列

val df: DataFrame = Seq(
  (Array("a", "b", "c")),
  (Array("d", "e"))
).toDF("value")

架构:

root
 |-- value: array (nullable = true)
 |    |-- element: string (containsNull = true)

当我使用列表达式计算每个数组中的元素数时,我得到了预期的结果:

df.select(size($"value")).show

印刷

+-----------+
|size(value)|
+-----------+
|          3|
|          2|
+-----------+

当我尝试将每一行映射到它的大小时,我1在每一行中只得到一个:

df.map(_.size).show

印刷

+-----+
|value|
+-----+
|    1|
|    1|
+-----+

为什么第二个版本只打印1每个数组而不是数组的大小?

标签: scalaapache-spark

解决方案


sizeon aRow给出了列/字段的数量,文档说:

行中的元素数

在你的情况下是 1。

你可以做的是:

df.map(_.getSeq(0).size)
  .show()

给出:

+-----+
|value|
+-----+
|    3|
|    2|
+-----+

推荐阅读