当前位置: 首页 > 面试题库 >

使用Apache Spark将键值对简化为键列表对

郜修雅
2023-03-14
问题内容

我正在编写一个Spark应用程序,并且想要将一组键-值对组合(K, V1), (K, V2), ..., (K, Vn)为一个“键-多值”对(K, [V1, V2, ..., Vn])。我觉得我应该可以使用reduceByKey带有某种风味的功能来做到这一点:

My_KMV = My_KV.reduce(lambda a, b: a.append([b]))

发生这种情况时出现的错误是:

‘NoneType’对象没有属性’append’。

我的键是整数,值V1,…,Vn是元组。我的目标是用键和值列表(元组)创建一对。


问题答案:

映射和ReduceByKey

输入类型和输出类型reduce必须相同,因此,如果要聚合列表,则必须map将输入输入到列表中。之后,将列表合并为一个列表。

合并清单

您需要一种将列表组合成一个列表的方法。Python提供了一些组合列表的方法。

append修改第一个列表,并将始终返回None

x = [1, 2, 3]
x.append([4, 5])
# x is [1, 2, 3, [4, 5]]

extend 做相同的事情,但是拆开列表:

x = [1, 2, 3]
x.extend([4, 5])
# x is [1, 2, 3, 4, 5]

这两个方法都返回None,但是您需要一个返回组合列表的方法,因此只需使用加号即可。

x = [1, 2, 3] + [4, 5]
# x is [1, 2, 3, 4, 5]

spark

file = spark.textFile("hdfs://...")
counts = file.flatMap(lambda line: line.split(" ")) \
         .map(lambda actor: (actor.split(",")[0], actor)) \

         # transform each value into a list
         .map(lambda nameTuple: (nameTuple[0], [ nameTuple[1] ])) \

         # combine lists: ([1,2,3] + [4,5]) becomes [1,2,3,4,5]
         .reduceByKey(lambda a, b: a + b)

组合键

也可以使用来解决此问题combineByKey,它在内部用于实现reduceByKey,但是更加复杂,并且
“在Spark中使用专用的每键组合器可以更快”
。对于上层解决方案,您的用例足够简单。

GroupByKey

也可以使用来解决此问题groupByKey,但是它会降低并行化,因此对于大数据集可能会慢得多。



 类似资料:
  • 问题内容: 具有键值列表: … 如何使用Java 8 API将其转换为Multimap? 程序方式: 结果: {25 = [13,15],15 = [10,12]} 问题答案: 这正是收集器允许您执行的操作: 然后,收集器将对象转换为它们各自的值。

  • 我有以下格式的列表 如何根据其键找到值,例如我需要第3行的名称...以及如何根据行对其进行排序

  • 问题内容: 我需要反序列化json,它是日期/长值的数组。这是返回的JSON的示例: 使用GSON,我可以将其反序列化为,但希望能够将其转换为类似以下内容的方法: 我似乎找不到一种方法来指示GSON将JSON映射的键/值映射到我的自定义类中的日期/值字段。有没有办法做到这一点,还是地图列表是唯一的路线? 问题答案: 您需要编写一个自定义解串器。您还需要使用可以实际解析的时区格式。无论是也将匹配,这

  • 根据一个对象中创建一个键-值对数组。 使用 Object.keys() 和 Array.map() 遍历对象的键并生成一个包含键值对的数组。 const objectToPairs = obj => Object.keys(obj).map(k => [k, obj[k]]); objectToPairs({ a: 1, b: 2 }); // [['a',1],['b',2]]

  • 虽然很多 Spark 操作工作在包含任意类型对象的 RDDs 上的,但是少数几个特殊操作仅仅在键值(key-value)对 RDDs 上可用。最常见的是分布式 "shuffle" 操作,例如根据一个 key 对一组数据进行分组和聚合。 在 Scala 中,这些操作在包含二元组(Tuple2)(在语言的内建元组中,通过简单的写 (a, b) 创建) 的 RDD 上自动地变成可用的,只要在你的程序中导

  • 问题内容: 我有一堂课 并希望将其序列化为 如何实现此目标(以及如何反序列化为对象? 我正在尝试使用 但显然最终会引号过多。 也不起作用,因为它不能创建足够的报价。 问题答案: 我发现了一种使用JsonSerializer的方法: 本类需要了解这一点: 反序列化非常相似: 这也需要在Foo类上进行注释: