【问题标题】:Efficient way to return Array[String] from a spark dataframe without using collect()不使用 collect() 从 spark 数据帧返回 Array[String] 的有效方法
【发布时间】:2020-10-28 14:48:07
【问题描述】:

我想从下面的数据框中以Array[String] 的形式返回child

root
     |-- parent: string (nullable = false)
     |-- child: array (nullable = true)
     |    |-- element: string (containsNull = true)

我目前正在这样做,它确实适用于更少的数据

df.collect().flatMap(x => x.getAs[Seq[String]]("child")).mkString(",")

但是有很多数据,并且 spark 驱动程序正在运行 Out Of Memory,因为已知 collect() 会这样做。

从上述数据帧返回字符串数组的有效方法是什么?

【问题讨论】:

  • 为什么需要用驱动收集数组?,可以在不收集和销毁驱动的情况下对dataframe做flatmap
  • 只这样做cSNHdf.flatMap(x => x.getAs[Seq[String]]("childsn")) 不起作用@EmiCareOfCell44

标签: scala apache-spark apache-spark-sql


【解决方案1】:

与 flatMap 类似:

df.flatMap(x => x.getAs[Seq[String]]("childsn")).show()

你会将孩子们分解成一个新的字符串列:

/*
+-------+
|  value|
+-------+
|child_1|
|child_2|
+-------+
*/

如果您需要创建另一列,子项用逗号分隔:

df.flatMap(x => Seq(x.getAs[Seq[String]]("childsn").mkString(","))).show()

它给出:

/*
+---------------+
|          value|
+---------------+
|child_1,child_2|
+---------------+
*/

【讨论】:

  • com.intellij.debugger.engine.evaluation.EvaluateException: Error evaluating method : '<init>': java.lang.IllegalArgumentException : Invalid argument count: expected 2, received 1 我收到此错误。我想以 Array[String] 而不是 df 的形式返回
  • 该错误与您使用 Intellij 调试代码的方式有关。与 Spark/Scla 无关
  • 这段代码仍然会给我带有 Array[String] 的数据框,而不是没有数据框的 Array[String] 本身。我只想要一个 Array[String] 而不是数据框。
  • 为什么需要一个数组?,你想用它做什么?使用 Spark 处理一个大文件然后收集到单台机器的内存中是没有意义的,除非您应用某种缩减或显示任何类型的统计信息或度量标准或应用无法分发的算法。
  • 我需要一个数组,因为接受此函数输出的函数将数组作为输入,我无法更改该函数。
猜你喜欢
  • 2020-07-22
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2015-12-09
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多