Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得与SparkRDD等效的SQL行号?

如何获得与SparkRDD等效的SQL行号?

提问于 2018-03-20 20:50:28
回答 2关注 0查看 1.1K

我需要生成一个完整的行列表_具有多列的数据表的数字。

在SQL中,这看起来如下所示:

代码语言:txt
AI代码解释
复制
select
   key_value,
   col1,
   col2,
   col3,
   row_number() over (partition by key_value order by col1, col2 desc, col3)
from
   temp
;

现在,假设在SPark中,我有一个(K,V)形式的RDD,其中V=(col1,col2,col3),所以我的条目如下

代码语言:txt
AI代码解释
复制
(key1, (1,2,3))
(key1, (1,4,7))
(key1, (2,2,3))
(key2, (5,5,5))
(key2, (5,5,9))
(key2, (7,5,5))
etc.

我希望使用sortBy()、sortWith()、sortByKey()、zipWithIndex等命令对这些命令进行排序,并使用正确的行创建一个新的RDD。_数

代码语言:txt
AI代码解释
复制
(key1, (1,2,3), 2)
(key1, (1,4,7), 1)
(key1, (2,2,3), 3)
(key2, (5,5,5), 1)
(key2, (5,5,9), 2)
(key2, (7,5,5), 3)
etc.

(我不关心括号,所以表单也可以是(K,(col1,col2,col3,rownum))

我该怎么做?

这是我的第一次尝试:

代码语言:txt
AI代码解释
复制
val sample_data = Seq(((3,4),5,5,5),((3,4),5,5,9),((3,4),7,5,5),((1,2),1,2,3),((1,2),1,4,7),((1,2),2,2,3))

val temp1 = sc.parallelize(sample_data)

temp1.collect().foreach(println)

// ((3,4),5,5,5)
// ((3,4),5,5,9)
// ((3,4),7,5,5)
// ((1,2),1,2,3)
// ((1,2),1,4,7)
// ((1,2),2,2,3)

temp1.map(x => (x, 1)).sortByKey().zipWithIndex.collect().foreach(println)

// ((((1,2),1,2,3),1),0)
// ((((1,2),1,4,7),1),1)
// ((((1,2),2,2,3),1),2)
// ((((3,4),5,5,5),1),3)
// ((((3,4),5,5,9),1),4)
// ((((3,4),7,5,5),1),5)

// note that this isn't ordering with a partition on key value K!

val temp2 = temp1.???

还请注意,函数sortBy不能直接应用于RDD,但必须首先运行Collection(),然后输出也不是RDD,而是数组

代码语言:txt
AI代码解释
复制
temp1.collect().sortBy(a => a._2 -> -a._3 -> a._4).foreach(println)

// ((1,2),1,4,7)
// ((1,2),1,2,3)
// ((1,2),2,2,3)
// ((3,4),5,5,5)
// ((3,4),5,5,9)
// ((3,4),7,5,5)

这里有一些进展,但仍然没有分区:

代码语言:txt
AI代码解释
复制
val temp2 = sc.parallelize(temp1.map(a => (a._1,(a._2, a._3, a._4))).collect().sortBy(a => a._2._1 -> -a._2._2 -> a._2._3)).zipWithIndex.map(a => (a._1._1, a._1._2._1, a._1._2._2, a._1._2._3, a._2 + 1))

temp2.collect().foreach(println)

// ((1,2),1,4,7,1)
// ((1,2),1,2,3,2)
// ((1,2),2,2,3,3)
// ((3,4),5,5,5,4)
// ((3,4),5,5,9,5)
// ((3,4),7,5,5,6)

回答 2

人生的旅途

回答已采纳

发布于 2018-03-21 04:58:51

row_number() over (partition by ... order by ...)功能添加到Spark1.4。这个答案使用PySPark/DataFrames。

创建一个测试DataFrame:

代码语言:txt
AI代码解释
复制
from pyspark.sql import Row, functions as F

testDF = sc.parallelize(
    (Row(k="key1", v=(1,2,3)),
     Row(k="key1", v=(1,4,7)),
     Row(k="key1", v=(2,2,3)),
     Row(k="key2", v=(5,5,5)),
     Row(k="key2", v=(5,5,9)),
     Row(k="key2", v=(7,5,5))
    )
).toDF()

添加分区行号:

代码语言:txt
AI代码解释
复制
from pyspark.sql.window import Window

(testDF
 .select("k", "v",
         F.rowNumber()
         .over(Window
               .partitionBy("k")
               .orderBy("k")
              )
         .alias("rowNum")
        )
 .show()
)

+----+-------+------+
|   k|      v|rowNum|
+----+-------+------+
|key1|[1,2,3]|     1|
|key1|[1,4,7]|     2|
|key1|[2,2,3]|     3|
|key2|[5,5,5]|     1|
|key2|[5,5,9]|     2|
|key2|[7,5,5]|     3|
+----+-------+------+

铁血之鹰

发布于 2018-03-21 06:37:20

这是你提出的一个有趣的问题。我将用Python来回答这个问题,但我相信你将能够无缝地将它翻译到Scala。

以下是我要处理的问题:

1.简化数据:

代码语言:txt
AI代码解释
复制
temp2 = temp1.map(lambda x: (x[0],(x[1],x[2],x[3])))

tv 2现在是一个“真正的”键值对。看起来是这样的:

代码语言:txt
AI代码解释
复制
[
((3, 4), (5, 5, 5)),  
((3, 4), (5, 5, 9)),   
((3, 4), (7, 5, 5)),   
((1, 2), (1, 2, 3)),  
((1, 2), (1, 4, 7)),   
((1, 2), (2, 2, 3))

]

2-然后,使用组-by函数通过以下方式再现分区的效果:

代码语言:txt
AI代码解释
复制
temp3 = temp2.groupByKey()

temo 3现在是一个有2行的RDD:

代码语言:txt
AI代码解释
复制
[((1, 2), <pyspark.resultiterable.ResultIterable object at 0x15e08d0>),  
 ((3, 4), <pyspark.resultiterable.ResultIterable object at 0x15e0290>)]

3-现在,需要为RDD的每个值应用一个秩函数。在python中,我将使用简单的排序函数(枚举将创建您的行)。_(编号栏):

代码语言:txt
AI代码解释
复制
 temp4 = temp3.flatMap(lambda x: tuple([(x[0],(i[1],i[0])) for i in enumerate(sorted(x[1]))])).take(10)

请注意,要实现特定的顺序,需要输入正确的“key”参数(在python中,我只创建一个lambda函数,如下所示:

代码语言:txt
AI代码解释
复制
lambda tuple : (tuple[0],-tuple[1],tuple[2])

在结尾处(没有键参数函数,它看起来是这样的):

代码语言:txt
AI代码解释
复制
[
((1, 2), ((1, 2, 3), 0)), 
((1, 2), ((1, 4, 7), 1)), 
((1, 2), ((2, 2, 3), 2)), 
((3, 4), ((5, 5, 5), 0)), 
((3, 4), ((5, 5, 9), 1)), 
((3, 4), ((7, 5, 5), 2))

]

希望能帮上忙!

祝好运!

和开发者交流更多问题细节吧,去 写回答
相关文章
sparkRdd ,breeze
统计行数,就是统计元素的个数 同时RDD计算具有惰性,只有涉及action操作才会执行,所以当出现count是,textFile 这些tranform操作,才会进行执行
Tim在路上
2020/08/04
8960
Mastercam如何去除行号
行号占用数控系统内存,行号对程序来说,可有可无,如何让mastercam后处理的程序没有行号呢?
lrglu
2022/06/30
3.1K0
Mastercam如何去除行号
如何快捷得去除代码中的行号?
关于如何将代码格式为上图,参考https://eternal-sun.blog.csdn.net/article/details/109230491
种花家的奋斗兔
2020/11/13
2K0
如何快捷得去除代码中的行号?
等效直径
算法:等效直径是与轮廓面积相等的圆形的直径,作为轮廓的特征,也作为图像的特征,通常情况下,轮廓是非规则外形的图像。
裴来凡
2022/05/28
9080
等效直径
如何在VimVi中显示行号
Vim/Vi是许多软件开发人员和Linux系统管理员首选的文本编辑器。 默认情况下,Vim不显示行号,但可以轻松打开它们。Vim支持三种行编号模式,可帮助你浏览文件。除了标准的绝对行编号之外,Vim还支持相对行和混合行编号模式。 绝对行号 绝对行号是标准行号,它在每行文本旁边显示适当的行号。 要激活行编号,请设置数字标志: 按Esc键切换到命令模式。 按:(冒号),光标将移动到屏幕的左下角。输入set number或set nu,然后按Enter。 :set number 行号将显示在屏幕的左侧: 要禁用
入门笔记
2022/06/02
4.6K0
「原创」如何快速获取银行、联行号的数据?
  经过一段时间的加班,终于是把项目熬上线了。本以为可以轻松一点,但往往事与愿违,出现了各种各样的问题。由于做的是POS前置交易系统,涉及到和商户进件以及交易相关的业务,需要向上游支付机构上送“联行号”,但是由于系统内的数据不全,经常出现找不到银行或者联行号有误等情况,导致无法进件。
不一样的科技宅
2021/06/10
4.2K1
「原创」如何快速获取银行、联行号的数据?
电阻电路的等效变化(Ⅰ)
欧姆定律:在同一电路中,通过某一导体的电流跟这段导体两端的电压成正比,跟这段导体的电阻成反比,这就是欧姆定律。公式为I=U/R 基尔霍夫定律:在前面的电路当中有介绍过的,概述:集总参数电路:集总参数思想是电路理论的最基本也是最核心的思想 。集总参数电路是由电路电气器件的尺寸和工作信号的波长来做标准划分的,要知道集总参数电路首先要了解实际电路的基本定义。实际电路有可分为分布参数电路和集总参数电路。基尔霍夫电流定律(KCL)  基尔霍夫电压定律(KVL) 等效变化:本篇内容的重点也是在学习电路当中必须要掌握的知识点,对电路在进行分析和计算的时候有的时候可以把某一部分的电路是可以进行化简的。那么此时就可以用较为难的一个电路化简成一个比较简单的电路。 这③个概念对于前期来说学电路是特别的重要的(✿◕‿◕✿)
謓泽
2022/12/12
6390
电阻电路的等效变化(Ⅰ)
电阻电路的等效变化(Ⅱ)
🚩write in front🚩    🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家 & 阿里云星级博主~掘金⇿InfoQ创作者~周榜99»总榜1184🏅 🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠  📝个人主页-謓泽的博客_CSDN博客📃 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏-【电路】原理_謓泽的博客-CSDN博客🎓 ✉️我们并非登
謓泽
2022/12/12
7140
电阻电路的等效变化(Ⅱ)
SparkRDD转DataSet/DataFrame的一个深坑
原需求:希望在map函数中将每一个rdd转为DataSet或者DataFrame。
王知无-import_bigdata
2019/10/23
1.3K0
SparkRDD转DataSet/DataFrame的一个深坑
原需求:希望在map函数中将每一个rdd转为DataSet或者DataFrame。
大数据真好玩
2019/10/25
7950
电阻电路等效变换(Ⅲ)
🚩write in front🚩   🔎大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 🏅2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家博主 & 星级博主~掘金⇿InfoQ创作者~周榜163﹣总榜1039⇿全网访问量30w+🏅 🆔本文由 謓泽 原创 CSDN首发🙉如需转载还请通知⚠ 📝个人主页⇢打打酱油desuCSDN博客💬 🎁欢迎各位⇢点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏⇢【电路】原理_謓泽的博客-CSDN博
謓泽
2022/12/12
6850
电阻电路等效变换(Ⅲ)
所得与所见:[-View周边-] 框架层
张风捷特烈
2023/09/01
2210
所得与所见:[-View周边-] 框架层
Linux小技巧:如何在 Vim 中显示行号?
Vim 是一款出色的编辑器,大多数 Linux/UNIX 系统管理员每天都喜欢并使用它。
网络技术联盟站
2022/03/02
12.9K0
Linux小技巧:如何在 Vim 中显示行号?
MHA安装及等效性配置
    MHA由MHA节点(可以理解为子节点)及MHA管理节点2部分组成。因此对于MHA的安装,相应的也分为2个部分,即安装MHA节点,安装MHA管理节点。本文基于CentOS 5.9 64bit简要描述了MHA的安装,同时也描述了在配置MHA时需要完成的等效性配置。供大家参考。
Leshami
2018/08/13
7190
Latex 去掉行号
尝试引用:\usepackage[numbers,sort&compress]{natbib}
林德熙
2022/08/04
3.5K0
Excel 保留行号的去重
遇到这个问题第一个念头是用脚本来做,虽然 VBA 编辑很方便,也肯定能解决,但是总觉得还是不如 Excel 本身提供的操作方便。
mzlogin
2020/04/16
1K0
vim编辑器永久显示行号(linux查看显示行号)
在linux环境下,vim是常用的代码查看和编辑工具。在程序编译出错时,一般会提示出错的行号,但是用vim打开的代码确不显示行号,错误语句的定位非常不便。那么怎样才能让vim显示代码的行号呢?
全栈程序员站长
2022/07/26
5.6K0
vim编辑器永久显示行号(linux查看显示行号)
datagridview显示行号
另一种也是在这个事件下面下面 用了个for循环来做index+1的单元格赋值,效率太慢了。
跟着阿笨一起玩NET
2018/09/18
2.2K0
Excel函数之查找班别的起始行号与结束行号
A列村里是“班别”是有901-913,我想知道901-913它们的起始行号与结束行号
哆哆Excel
2022/10/25
1.5K0
Excel函数之查找班别的起始行号与结束行号
【Android】设置透明、半透明等效果
View v = findViewById(R.id.content);//找到你要设透明背景的layout 的id
易寒
2021/12/22
4K0

相似问题

现在的获客saas平台有哪些?

084

如何在Eclipse中显示行号?

2487

如何使phpstorm默认显示行号?

2404

自媒体计划获赠的域名已实名登记后,还需要做哪些事,使得该域名能正常使用?

1182

Cnblogs-Theme-SimpleMemory 皮肤行号修复(基于1.3.0)?

0276
相关问答用户
中建数科 | 技术总监架构部总经理擅长3个领域
擅长5个领域
公司公司公司公司公司公司 | 职务职务职务职务职务职务擅长3个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档