【pyspark学习从入门到精通8】DataFrames_3
目录
与 RDDs 互操作
有两种不同的方法将现有的 RDDs 转换为 DataFrames(或 Datasets[T]):使用反射推断模式,或者以编程方式指定模式。前者允许您编写更简洁的代码(当您的 Spark 应用程序已经知道模式时),而后者允许您在运行时才揭示列及其数据类型时构建 DataFrames。注意,反射是指模式反射,而不是 Python 反射。
使用反射推断模式
在构建 DataFrame 和运行查询的过程中,我们忽略了 DataFrame 的模式是自动定义的这一事实。最初,通过将键/值对列表作为 **kwargs 传递给 row 类来构建行对象。然后,Spark SQL 将这些行对象的 RDD 转换为 DataFrame,其中键是列,数据类型是通过采样数据推断出来的。
回到代码,最初创建 swimmersJSON DataFrame 后,没有指定模式,您会注意到使用 printSchema() 方法定义的模式:
# Print the schema
swimmersJSON.printSchema()
这给出了以下输出:
但如果我们想要指定模式,因为在这个例子中,我们知道 id 实际上是一个 long 而不是一个字符串呢?
以编程方式指定模式
在这种情况下,让我们通过引入 Spark SQL 数据类型(pyspark.sql.types)并为此示例生成一些.csv数据来以编程方式指定模式:
# Import types
from pyspark.sql.types import *
# Generate comma delimited data
stringCSVRDD = sc.parallelize([
(123, 'Katie', 19, 'brown'),
(234, 'Michael', 22, 'green'),
(345, 'Simone', 23, 'blue')
])
首先,我们将根据下面的 [schema] 变量将模式编码为字符串。然后,我们将使用 StructType 和 StructField 定义模式:
# Specify schema
schema = StructType([
StructField("id", LongType(), True),
StructField("name", StringType(), True),
StructField("age", LongType(), True),
StructField("eyeColor", StringType(), True)
])
注意,StructField 类是基于以下方面分解的:
- name:此字段的名称
- dataType:此字段的数据类型
- nullable:表示此字段的值是否可以为 null
最后,我们将应用我们创建的模式(schema)到 stringCSVRDD RDD(即 generated.csv 数据),并创建一个临时视图,以便我们可以使用 SQL 查询它:
# Apply the schema to the RDD and Create DataFrame
swimmers = spark.createDataFrame(stringCSVRDD, schema)
# Creates a temporary view using the DataFrame
swimmers.createOrReplaceTempView("swimmers")
在这个例子中,我们对模式有了更细粒度的控制,可以指定 id 是一个 long(与前一节中的字符串相对):
swimmers.printSchema()
这给出了以下输出:
使用 DataFrame API 查询
如前一节所述,您可以开始使用 collect()、show() 或 take() 来查看 DataFrame 中的数据(后两者包括限制返回行数的选项)。
行数
要获取 DataFrame 中的行数,您可以使用 count() 方法:
swimmers.count()
这给出了以下输出:Out[13]: 3
运行过滤语句
要运行过滤语句,您可以使用 filter 子句;在以下代码片段中,我们使用 select 子句来指定要返回的列:
# Get the id, age where age = 22
swimmers.select("id", "age").filter("age = 22").show()
# Another way to write the above query is below
swimmers.select(swimmers.id, swimmers.age).filter(swimmers.age == 22).
show()
这个查询的输出是仅选择 id 和 age 列,其中 age = 22:
如果我们只想获取眼睛颜色以字母 b 开头的游泳者的名称,我们可以使用类似 SQL 的语法,如下所示的代码:
# Get the name, eyeColor where eyeColor like 'b%'
swimmers.select("name", "eyeColor").filter("eyeColor like 'b%'").
show()
输出如下:
原文地址:https://blog.csdn.net/qq_32146369/article/details/140248337
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!