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

在spark scala中进行reduceByKey转换后,将所有列取回

栾钟展
2023-03-14

我是堆栈溢出和火花的新手。基本上做RDD转换。

我的输入数据:

278222631,2763985,10.02.12,01.01.53,Whatsup,NA,Email,Halter,wagen,28.06.12,313657794,VW,er,i,B,0,23.11.11,234
298106482,2780663,22.02.12,22.02.12,Whatsup,NA,WWW,Halter,wagen,26.06.12,284788860,VW,er,i,B,0,02.06.04,123

我的RDD格式

val dateCov: RDD[(Long, Long, String, String, String, String, String, String, String, String, Long, String, String, String, String, String, String, Long)]

做一些还原Bykey转换映射([(k, k),(v)],将coll(1,17)作为key,将coll(18)作为Value。并在还原ByKey上应用了一些函数

例子:

val reducedSortedRDD = dateCov.map(r => { ((r._1, r._11) -> (r._18)) })
      .reduceByKey((x, y) => ((math.min(x, y)))) // find minimum diff
      .map(r => (r._1._1, r._1._2, r._2))
      .sortBy(_._1, true)
  1. 我的问题-在reduceByKey函数之后是否可以获取所有其他列,即我的reducedSortedRDD返回类型应该是reducedSortedRDD:RDD[(长、长、字符串、字符串、字符串、字符串、字符串、字符串、字符串、长、字符串、字符串、字符串、字符串、字符串、字符串、字符串)]

与本例不同,不reducedSortedDRDD:RDD[(长、长、长)]

我使用的是spark 1.4

共有1个答案

蒋英博
2023-03-14

据我所知,您需要将所有列都放在您的还原ByKey函数中(请记住打乱额外数据的开销),或者您可以将还原SortedRDD与原始数据连接起来。

要使所有列都显示出来,可以执行以下操作:

val reducedSortedRDD = dateCov
  .map(r => ((r._1, r._11),(r._18, r._2, r._3, ..., r._17)))
  .reduceByKey((value1,value2) => if (value1._1 < value2._1) value1 else value2)
  .map{case(key, value) => (key._1, key._2, value._2, value._3, ..., value._17, value._1)}
  .sortBy(_._1, true)

要加入,它看起来像这样:

val keyValuedDateCov = dateCov
  .map(r => ((r._1, r._11, r._18), (r._1, r._2,r._3, ...., r._17)))

val reducedRDD = dateCov
  .map(r => ((r._1, r._11), r._18))
  .reduceByKey((x, y) => math.min(x, y)) // find minimum diff
  .map{case(key, value) => ((key._1, key._2, value), AnyRef)}

val reducedSortedRDD = reducedRDD
  .join(keyValuedDateCov)
  .map{case(key, (_, original)) => (key._1, key._2, original._1, original._2, original._3, ..., original._17, key._3)}
  .sortBy(_._1, true)

联接版本的缺点在于,如果原始数据中的多行在第1列、第17列和第18列中具有完全相同的值,那么最终结果也将包含多个具有这些值的行,因此不能适当地减少。如果保证数据在这些列中不会有多个具有相同值的行,那么应该没有问题。

 类似资料:
  • 我有以下RDD代表销售数据: 我试图制作一个,其中一个键是由SalesData中的一个(saleType saleDate)组成的字符串。实际上,我想过滤掉saleType saleDate相同的SalesData,然后返回,不带重复项。 我尝试了以下方法:首先将RDD映射到结构,其中键是(saleType saleDate),值是saleData。然后调用reduceByKey,选择某个键第一次

  • 你好,我经常需要在代码中使用,但我知道这是一个非常繁重的操作。由于我正在努力提高性能,我想知道删除所有调用的方法是否有效。 我使用的是,但是由于这种方法对于大型数据集可能会有很大的问题,所以我想使用这个解决方案: 我所做的不是创建类型对(Int,Int)的RDD,而是创建类型对(Int,list[Int]),所以我的如下所示 你认为有没有更快的方法来达到同样的结果,使用一些其他的方法?谢谢你。

  • 问题内容: 我正在寻找一种在SQL Server中将行转换为列的有效方法,听说PIVOT速度不是很快,并且我需要处理很多记录。 这是我的示例: 这是我的结果: 如何生成结果? 问题答案: 您可以通过多种方式将数据从多行转换为列。 使用 在SQL Server中,您可以使用该函数将数据从行转换为列: 参见演示。 枢轴数未知 如果您要转置的数目未知,则可以使用动态SQL: 参见演示。 使用聚合函数 如

  • 我有一个简单的JSON对象{“a”:{“key1”:“value1”,“key2”:“value2”,“key3”:“value3”},我想用一列“Key”将其转换成行。问题是我事先不知道钥匙的名字,或者有多少。换句话说,可能有“键4”、“键5”。也可能有“xyz1”:“xyz1”作为“a”对象中的键/值。我可以用JavaScript迭代这个JSON对象,但我这里的任务是,假设这个JSON对象作为

  • 问题内容: 我有以下Python pandas数据框: 我想要: 我看过pivot(),pivot_table(),Transpose和unstack(),它们似乎都没有给我。熊猫新手,所以所有帮助表示赞赏。 问题答案: 您需要通过转置: 如果需要重命名列,则有点复杂: 另一个更快的解决方案是使用: 时间 :

  • 我是数据科学的初学者,我正在尝试使用Pandas来旋转此数据框架: 所以它变成这样:(标签应该变成列,文件路径变成行。) “标签”列是一组或一类文件路径。我想把它转换成这样一种方式,它适合这个函数:tf。Keras.preprocessing.image.flow_from_dataframe 提前感谢所有帮助我的人。