当前位置: 首页 > 知识库问答 >
问题:

如何在Spark中展平元组?

景景胜
2023-03-14

我想展平元组的RDD(使用无操作映射),但我得到了一个类型错误:

val fromTuples = sc.parallelize( List((1,"a"), (2, "b"), (3, "c")) )
val flattened = fromTuples.flatMap(x => x)
println(flattened.collect().toNiceString)

给予

错误:类型不匹配;

找到:(Int,String)必需:TraversableOnce[?]

ap.flat地图(x=

lists或Arrays的等效列表可以正常工作,例如:

val fromList = sc.parallelize(List(List(1, 2), List(3, 4)))
val flattened = fromList.flatMap(x => x)
println(flattened.collect().toNiceString)

Scala能处理吗?如果没有,为什么没有?

共有3个答案

井翰
2023-03-14
  val fromTuples = sc.parallelize(List((1, "a"), (2, "b"), (3, "c")))
  val flattened = fromTuples.flatMap(x => Array(x))
  flattened.collect()

你犯错误的原因是

平面图(func)类似于map,但每个输入项都可以映射到0个或多个输出项(因此func应该返回Seq而不是单个项)。

丁志勇
2023-03-14

没有一个很好的方法,但是你可以用这个方法保持一点类型安全:

val fromTuples = session.sparkContext.parallelize(List((1, "a"), (2, "b"), (3, "c")))
val flattened = fromTuples.flatMap(t => Seq(t._1, t._2))
println(flattened.collect().mkString)

扁平化的类型将是元组中所有类型的父类型的RDD。是的,在这种情况下是Any,但如果列表是:list((“1”,“a”),(“2”,“b”),它将保留字符串类型。

糜野
2023-03-14

元组不是集合。与Python不同,在Python中元组本质上只是一个不可变的列表,Scala中的元组更像一个类(或者更像Pythonnamedtuple)。你不能“展平”元组,因为它是一组异质的字段。

您可以通过调用将元组转换为可编辑的内容。productIterator,但是你得到的是一个Iterable[Any]。您当然可以将这样的东西展平,但这样就失去了所有编译时类型保护。(大多数Scala程序员一想到类型Any的集合就不寒而栗)

 类似资料:
  • 问题内容: 如我们所知,通过使用方法将数组展平 那么如何将此数组展平到? 问题答案: 这是递归的一种替代方法,并且应接受任何深度级别,以避免堆栈溢出。

  • 问题内容: 给定以下元组列表: 我如何将其拼凑成列表? 有没有一线做上面的事情? 问题答案: 您可以使用列表推导: 在以下情况下也经常使用: 但是,这并不是完全一样的。

  • 我想把这个val: 对它进行一些操作(我正在考虑展平) 然后得到这个结果 如果展平方法在这里不合适,那很好。只要我得到结果。 谢啦!

  • 问题内容: 我具有列表的以下元素,并且列表的长度为100个元素。 如何将每个元素转换为如下形式? 问题答案: 元组打包和解包解决了该问题。

  • 问题内容: 在PHP中,是否可以在不使用递归或引用的情况下展平(双向/多维)数组? 我只关心的值,这样的键可以忽略不计,我想在的线和。 问题答案: 您可以使用标准PHP库(SPL) “隐藏”递归。 版画

  • 问题内容: 我做了一个相当大的Docker容器。当我提交容器以创建映像时,该映像大约有7.8 GB。但是,当我将容器(不是映像!)放到压缩包中并重新导入时,映像只有3 GB。当然,历史已经丢失了,但是对我来说这没关系,因为我认为映像已“完成”并准备部署。 如何展平图像/容器而不将其导出到磁盘并再次导入? 并且:这样做是一个明智的主意,还是我错过了一些重要的观点? 问题答案: 从Docker 1.1