【问题标题】:Counting elements in array column with map使用地图计算数组列中的元素
【发布时间】:2019-09-19 03:33:43
【问题描述】:

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

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而不是数组的大小?

【问题讨论】:

  • 因为您要求 row 的大小为 1。如果您想使用 map 函数,最好使用类型 数据集,试试df.as[Array[Int]].map(_.size).show()

标签: scala apache-spark


【解决方案1】:

Row 上的size 给出了列/字段的数量,文档说:

行中的元素数

在你的情况下是 1。

你可以做的是:

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

给予:

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

【讨论】:

    猜你喜欢
    • 2013-05-27
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2015-12-01
    相关资源
    最近更新 更多