【pyspark学习从入门到精通7】DataFrames_2

目录

创建 DataFrames

生成我们自己的 JSON 数据

创建 DataFrame

创建临时表

简单的 DataFrame 查询

DataFrame API 查询

SQL 查询


创建 DataFrames

通常,您会通过使用 SparkSession(或在 PySpark shell 中调用 spark)导入数据来创建 DataFrame。

我们将讨论如何将数据导入到本地文件系统、Hadoop 分布式文件系统(HDFS)或其他云存储系统(例如,S3 或 WASB)。在本文中,我们将专注于在 Spark 内直接生成您自己的 DataFrame 数据或利用 Databricks 社区版中已经可用的数据源。

首先,我们将不访问文件系统,而是通过生成数据来创建 DataFrame。在这种情况下,我们将首先创建 stringJSONRDD RDD,然后将其转换为 DataFrame。这段代码片段创建了一个包含游泳者(他们的 ID、姓名、年龄和眼睛颜色)的 JSON 格式的 RDD。

生成我们自己的 JSON 数据

下面,我们将最初生成 stringJSONRDD RDD:

python">stringJSONRDD = sc.parallelize(("""
 { "id": "123",
"name": "Katie",
"age": 19,
"eyeColor": "brown"
 }""",
"""{
"id": "234",
"name": "Michael",
"age": 22,
"eyeColor": "green"
 }""", 
"""{
"id": "345",
"name": "Simone",
"age": 23,
"eyeColor": "blue"
 }""")
)

现在我们已经创建了 RDD,我们将使用 SparkSession 的 read.json 方法(即 spark.read.json(...))将其转换为 DataFrame。我们还将使用 .createOrReplaceTempView 方法创建一个临时表。

创建 DataFrame

以下是创建 DataFrame 的代码:

python">swimmersJSON = spark.read.json(stringJSONRDD)

创建临时表

以下是创建临时表的代码:

python">swimmersJSON.createOrReplaceTempView("swimmersJSON")

如前文所述,许多 RDD 操作是转换,这些转换直到执行动作操作时才执行。例如,在前面的代码片段中,sc.parallelize 是一个转换,当使用 spark.read.json 从 RDD 转换为 DataFrame 时执行。注意,在这段代码的笔记本截图中(左下角附近),直到包含 spark.read.json 操作的第二个单元格,Spark 作业才执行。

为了进一步强调这一点,在下图的右侧窗格中,我们展示了执行的 DAG 图。

在下面的截图中,您可以看到 Spark 作业的 parallelize 操作来自生成 RDD stringJSONRDD 的第一个单元格,而 map 和 mapPartitions 操作是创建 DataFrame 所需的操作:

需要注意的是,parallelize、map 和 mapPartitions 都是 RDD 转换。在 DataFrame 操作 spark.read.json(在本例中)中,不仅有 RDD 转换,还有将 RDD 转换为 DataFrame 的动作。这是一个重要的说明,因为即使您正在执行 DataFrame 操作,要调试您的操作,您需要记住您将在 Spark UI 中理解 RDD 操作。

请注意,创建临时表是一个 DataFrame 转换,并且在执行 DataFrame 动作之前不会执行(例如,要执行的 SQL 查询)。

简单的 DataFrame 查询

现在您已经创建了 swimmersJSON DataFrame,我们将能够在其上运行 DataFrame API 以及 SQL 查询。让我们从一个简单的查询开始,显示 DataFrame 中的所有行。

DataFrame API 查询

要使用 DataFrame API 执行此操作,您可以使用 show(<n>) 方法,该方法将前 n 行打印到控制台:

python"># DataFrame API
swimmersJSON.show()

这将给出以下输出:

SQL 查询

如果您更倾向于编写 SQL 语句,您可以编写以下查询:

python">spark.sql("select * from swimmersJSON").collect()

这将给出以下输出:

我们使用了 .collect() 方法,它返回所有记录作为一个行对象(Row objects)的列表。请注意,您可以对 DataFrames 和 SQL 查询使用 collect() 或 show() 方法。只要确保,如果您使用 .collect(),这是针对小 DataFrame 的,因为它将返回 DataFrame 中的所有行,并将它们从执行器移回驱动程序。您可以改用 take(<n>) 或 show(<n>),这允许您通过指定 <n> 来限制返回的行数:


http://www.niftyadmin.cn/n/5708194.html

相关文章

几何完备的3D分子生成/优化扩散模型 GCDM-SBDD - 评测

GCDM 是一个新的 3D 分子生成扩散模型&#xff0c;与之前的 EDM 相比&#xff0c;GCDM 优化了其中的图神神经网络部分&#xff0c;使用手性敏感的 SE3 等变神经网络 GCPNET 代替了 EDM 中的 EGNN&#xff0c;让节点间消息传递、聚合根据手性不同而进行。本文对 GCDM-SBDD&#…

Stable Diffusion【应用篇】【插画转绘】:建筑风景图片的插画转绘制作教程

学好 AI绘画 不论是就业还是做副业赚钱都不错&#xff0c;但要学会 AI绘画 还是要有一个学习规划。最后大家分享一份全套的 AI绘画 学习资料&#xff0c;给那些想学习 AI绘画 的小伙伴们一点帮助&#xff01; 图片的插画转绘有很多种不同的风格&#xff0c;今天我们分享另一种…

【Unity - 屏幕截图】技术要点

在Unity中想要实现全屏截图或者截取某个对象区域的图片都是可以通过下面的函数进行截取 Texture2D/// <summary>/// <para>Reads the pixels from the current render target (the screen, or a RenderTexture), and writes them to the texture.</para>/…

ES6新特性2- Promise的介绍和使用,map和set集合,ES6-新增对象方法, async和await

目录 一、Promise简介 二、Promise的三种状态 三、Promise的基本用法 四、Promise的实例方法 五、Promise的链式调用 六、Promise封装读取文件 步骤 七、promise封装AJAX请求 map和set() map() Set 拓展 注意 ES6-新增对象方法 1. Object.is() 2. Object.assign(…

【LeetCode】每日一题 2024_10_9 找到按位或最接近 K 的子数组(LogTrick、位运算)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;找到按位或最接近 K 的子数组 代码与解题思路 今天是 2100 的题目&#xff0c;难度略高&#xff0c;不在我的能力范围&#xff0c;推荐题解&#xff1a;两种方法&#xff1a;LogTrick/滑…

Prism导航入门学习笔记

首先创建一个空的Prism项目 在View文件夹中创建一个UserControl的A界面&#xff0c;再在ViewModel中创建一个AViewModel的类 在主页面中创建Button按钮&#xff0c;使用Command属性&#xff0c;指向导航命令的方法&#xff0c;CommandParameter指向导航的页面 <Grid><…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go&#xff1f; 简单好记的关键词和语法&#xff1b;更高的效率&#xff1b;生态强大&#xff1b;语法检查严格&#xff0c;安全性高&#xff1b;严格的依赖管理&#xff0c; go mod 命令&#xff1b;强大的编译检查、严格的编码规范和完整的…

C++学习路线(十六)

void类型指针 void -> 空类型 void* -> 空类型指针&#xff0c;只存储地址的值&#xff0c;丢失类型&#xff0c;无法访问&#xff0c;要访问里面的值 我们必须对指针进行正确的类型转换&#xff0c;然后再间接引用指针 所有其它类型的指针都可以隐式自动转换成 void 类型…