【问题标题】:How do I return Multi-Column Key and Value pairs in Scala using Spark如何使用 Spark 在 Scala 中返回多列键和值对
【发布时间】:2018-11-07 16:36:57
【问题描述】:

我想将下面的 RDD 转换为键值对,每个键都有两个值。 第一列应该是键,第二列和第三列应该是值。如何使用 scala 中的 Case 类来执行转换?

scala> input
res31: org.apache.spark.rdd.RDD[org.apache.spark.sql.Row] = MapPartitionsRDD[60] at rdd at <console>:35

scala> input.take(5).foreach(println)
[Ace,Ball,null]
[Kids,Kids,null]
[Hardware,Hardware,null]
[Market,Market,Markets]
[Adventure,Adventure,null]

预期的 O/P: 我期待一个非常像 Python 字典的键值对。一个键将保存多个值,因此这些值将是一个元组。一旦我们有了键值对,基于键 i 应该能够提取值。

例如

d = {key1: [val1, val2, val3....], key2: [valx, valy, valz, ...], ....}

d[key1][0]给出key1的第一个值

希望我能清楚地表达我的要求

【问题讨论】:

  • 你能分享你的预期输出吗?
  • @RameshMaharjan 更新了我的问题
  • 你为什么不坚持使用数据框?
  • @RameshMaharjan 我对 Dataframes 也没有任何问题。但我真的不使用任何 SparkSQL 来做到这一点。将其视为 3 列 DF,其中第 1 列是键,接下来 2 列是值,如果将键作为输入字符串,我需要根据需要使用第一个值或第二个值。
  • 所以你的意思是,如果提供了 Ace,那么你希望 Ball 作为第一个值,而 null 作为第二个值?

标签: scala apache-spark


【解决方案1】:

您可以使用Tuple2。假设您希望输出为:

(Ace, (Ball, null))
(Kids, (Kids, null))
..
(Adventure, (Adventure, null))

您可以尝试以下方法:

val output = input.map(x => Tuple2(x.getString(0), (x.getString(1), x.getString(2))))
output.take(5).foreach(println)

【讨论】:

  • 谢谢,如果我想获取第一个键的第一个值,我应该怎么做?
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2017-02-05
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 2019-03-02
相关资源
最近更新 更多