热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sparksql之join等函数用法

环境说明:首先搭建好spark环境,然后使用命令pyspark进入python环境编写如果之前使用过sql语句,那么sparksql学起来会很快。sparksql可以将rdd转换

环境说明:首先搭建好spark环境,然后使用命令pyspark进入python环境编写
如果之前使用过sql语句,那么spark sql学起来会很快。spark sql可以将rdd转换为dataframe来进行使用,也可以将dataframe注册为表,使用sql语言来处理数据,使用起来很方便。
参考链接:
http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.functions.collect_set
1. 构造数据

from pyspark.sql.types import *
#创建第一个dataframe
rdd = sc.parallelize([(1,'Alice', 18),(2,'Andy', 19),(3,'Bob', 17),(4,'Justin', 21),(5,'Cindy', 20)])
schema = StructType([
StructField("id", IntegerType(), True),
StructField("name", StringType(), True),
StructField("age", IntegerType(), True)
])
df = spark.createDataFrame(rdd, schema)
df.show()

结果如下:
这里写图片描述

#创建第二个dataframe
rdd2 = sc.parallelize([('Alice', 160),('Andy', 159),('Bob', 170),('Cindy', 165),('Rose', 160)])
schema2 = StructType([
StructField("name", StringType(), True),
StructField("height", IntegerType(), True)
])
df2 = spark.createDataFrame(rdd2, schema2)
df2.show()

结果如下:
这里写图片描述

#创建第三个dataframe
rdd3 = sc.parallelize([(1,'Alice', 160),(2,'Andy', 159),(3,'Tom', 175),(4,'Justin', 171),(5,'Cindy', 165)])
schema3 = StructType([
StructField("id", IntegerType(), True),
StructField("name", StringType(), True),
StructField("height", IntegerType(), True)
])
df3 = spark.createDataFrame(rdd3, schema3)
df3.show()

结果如下:
这里写图片描述
2. inner join

df.join(df2, "name", "inner").select("id", df.name, "age", "height").orderBy("id").show()

结果如下:
这里写图片描述
如果不写连接类型,默认是inner join,例子如下图:
这里写图片描述
如果内连接的参数不只一个,将参数放在一个列表中

df.join(df3, ["id", "name"], "inner").select(df.id, df.name,"age", "height").orderBy(df.id).show()

结果如下:
这里写图片描述
2. outer join
full outer join全外连接
注意:不能用…select(df.name),会报错

df.join(df2, "name", "outer").select("id", "name", "age", "height").orderBy("id").show()

结果如下:
这里写图片描述
left outer join

df.join(df2, "name", "left").select("id", "name", "age", "height").orderBy("id").show()
或者
df.join(df2, "name", "left").select("id", df.name, "age", "height").orderBy("id").show()

结果如下:
这里写图片描述
right outer join

df.join(df2, "name", "right").select("id", "name", "age", "height").orderBy("id").show()
或者
df.join(df2, "name", "right").select("id", df2.name, "age", "height").orderBy("id").show()

结果如下:
这里写图片描述
3. orderBy()函数
默认是升序排列

from pyspark.sql.functions import *
df2.orderBy("height",desc("name")).show()

结果如下:
这里写图片描述

df2.orderBy(["height","name"]).show()

这里写图片描述
上述结果是不一样的,名字排序顺序不一样
4. cast()函数
常用来做类型转换

df.select(df.age.cast(StringType())).show()
或者
df.selectExpr("cast(age as string)age").show()

5 row_number().over()

from pyspark.sql.types import *
from pyspark.sql import Window
from pyspark.sql.functions import *
rdd = sc.parallelize([(1,'Alice', 18),(2,'Andy', 19),(3,'Bob', 17),(1,'Justin', 21),(1,'Cindy', 20)])
schema = StructType([
StructField("id", IntegerType(), True),
StructField("name", StringType(), True),
StructField("age", IntegerType(), True)
])
df = spark.createDataFrame(rdd, schema)
#按照每个组内的年龄排序,组外的分布并不管
df.withColumn("rn", row_number().over(Window.partitionBy("id").orderBy("age"))).show()
#结果如下:
# +---+------+---+---+
# | id| name|age| rn|
# +---+------+---+---+
# | 1| Alice| 18| 1|
# | 1| Cindy| 20| 2|
# | 1|Justin| 21| 3|
# | 3| Bob| 17| 1|
# | 2| Andy| 19| 1|
# +---+------+---+---+

#按照年龄排序,组外面分布也管
df.withColumn("rn", row_number().over(Window.partitionBy("id").orderBy("age"))).orderBy("age").show()
#结果如下:
# +---+------+---+---+
# | id| name|age| rn|
# +---+------+---+---+
# | 3| Bob| 17| 1|
# | 1| Alice| 18| 1|
# | 2| Andy| 19| 1|
# | 1| Cindy| 20| 2|
# | 1|Justin| 21| 3|
# +---+------+---+---+

推荐阅读
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文详细介绍了定时器输入捕捉技术的原理及其应用。通过配置定时器通道的引脚模式为输入模式,并设置相应的捕获触发条件,可以实现对外部信号的精确捕捉。该技术在实时控制系统中具有广泛的应用,如电机控制、频率测量等场景。文中还提供了具体的配置步骤和示例代码,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 深入解析 SQL 数据库查询技术
    本文深入探讨了SQL数据库查询技术,重点讲解了单表查询的各种方法。首先,介绍了如何从表中选择特定的列,包括查询指定列、查询所有列以及计算值的查询。此外,还详细解释了如何使用列别名来修改查询结果的列标题,并介绍了更名运算的应用场景和实现方式。通过这些内容,读者可以更好地理解和掌握SQL查询的基本技巧和高级用法。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • MyISAM和InnoDB是MySQL中最为广泛使用的两种存储引擎,每种引擎都有其独特的优势和适用场景。MyISAM引擎以其简单的结构和高效的读取速度著称,适用于以读操作为主、对事务支持要求不高的应用。而InnoDB引擎则以其强大的事务处理能力和行级锁定机制,在需要高并发写操作和数据完整性的场景下表现出色。选择合适的存储引擎应综合考虑业务需求、性能要求和数据一致性等因素。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 为了优化用户体验,本文探讨了如何调整下拉菜单的宽度。通过合理设置宽度,可以提升界面的美观性和易用性。文章提供了具体的代码示例,帮助开发者实现这一目标。例如,可以通过 CSS 或 JavaScript 来动态调整下拉菜单的宽度,确保其在不同设备和屏幕尺寸上都能保持良好的显示效果。 ... [详细]
author-avatar
amwaysuju
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有