pyspark--创建DataFrame
目录
- 一、通过列表创建
- 1. 元组列表
- 2. 字典列表
- 二、通过pandas创建
- 1. 不指定schema
- 2. 指定schema
- 三、通过rdd创建
- 1. 不指定schema
- 2. 指定schema
- 3. 将rdd映射为Row格式
- 4. 提前指定rdd为Row格式
- 5. rdd转dataframe
- 四、创建空dataframe
- 1. 依据指定schema创建
- 2. 依据已有dataframe创建
一、通过列表创建
1. 元组列表
列表中指定多个行,每行数据用一个元组形式表示,同时用一个列表表示每一列的列名。
value = [('Alice', 18), ('Bob', 19)]
df = spark.createDataFrame(value, ['name', 'age'])
df.show()
结果如下:
+-----+---+
| name|age|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
2. 字典列表
或者采用字典的形式分别表示每行数据,每一行是一个字典数据,用key表示列名,value表示具体的值,如下所示:
value = [{'name': 'Alice', 'age': 18}, {'name': 'Bob', 'age': 19}]
df = spark.createDataFrame(value)
df.show()
结果如下:
+---+-----+
|age| name|
+---+-----+
| 18|Alice|
| 19| Bob|
+---+-----+
二、通过pandas创建
1. 不指定schema
先通过pandas构建一个dataframe(具体可参考pandas的dataframe),然后再通过这个pandas的dataframe构建spark的dataframe,如下所示:
import pandas as pddf_pd = pd.DataFrame([('Alice', 18), ('Bob', 19)])
df = spark.createDataFrame(df_pd)
df.show()
结果如下,未指定列信息schema的情况下,会自动为每个列指定名称为数字,从0开始。
+-----+---+
| 0| 1|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
2. 指定schema
而如果我们指定好列的schema信息,则可以构建指定列名的dataframe,如下所示:
import pandas as pd
from pyspark.sql.types import *df_pd = pd.DataFrame([('Alice', 18), ('Bob', 19)])
schema = StructType([StructField("name", StringType(), True), StructField("age", IntegerType(), True)])
df = spark.createDataFrame(df_pd, schema)
df.show()
结果如下所示:
+-----+---+
| name|age|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
或者也可以用如下的简写形式:
import pandas as pd
from pyspark.sql.types import *df_pd = pd.DataFrame([('Alice', 18), ('Bob', 19)])
schema = "name: string, age: int"
df = spark.createDataFrame(df_pd, schema)
df.show()
得到的结果与上面的相同。
三、通过rdd创建
1. 不指定schema
先构建一个rdd,然后再通过rdd创建dataframe。
value = [('Alice', 18), ('Bob', 19)]
rdd = spark.sparkContext.parallelize(value)
df = spark.createDataFrame(rdd)
df.show()
结果如下所示,在不指定列名的情况下,默认列名为下划线加数字,从1开始:
+-----+---+
| _1| _2|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
2. 指定schema
如果想要指定列结构schema信息,可以采用如下形式:
value = [('Alice', 18), ('Bob', 19)]
rdd = spark.sparkContext.parallelize(value)
schema = "name: string, age: int"
df = spark.createDataFrame(rdd, schema)
df.show()
schema信息也可以采用以下方式定义:
schema = StructType([StructField("name", StringType(), True),StructField("age", IntegerType(), True)])
结果如下:
+-----+---+
| name|age|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
3. 将rdd映射为Row格式
也可以采用如下形式指定schema信息:
from pyspark.sql import Rowvalue = [('Alice', 18), ('Bob', 19)]
rdd = spark.sparkContext.parallelize(value)
Person = Row('name', 'age')
person = rdd.map(lambda r: Person(*r))
df = spark.createDataFrame(person)
df.show()
结果如下:
+-----+---+
| name|age|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
要理解上述采用Row对象的方式指定schema,我们可以先看看如下代码:
print(Row)
print(Row('name', 'age'))
print(Row('name', 'age')('Alice', 18))
结果如下,我们会发现Row('name', 'age')
其实是创建了一个Row('name', 'age')
类,这个类指定了每一列的列名。然后我们用这个类可以创建具体的对象。
<class 'pyspark.sql.types.Row'>
<Row('name', 'age')>
Row(name='Alice', age=18)
那么回到前面的代码,我们的Person是一个Row类型对象,指定了每一列的列名信息。而person则对rdd中的每一个元素进行映射,将原先的tuple类型转为了Row类型,我们不妨打印这几个看看:
print(Person)
print(rdd.collect())
print(person.collect())
结果如下:
<Row('name', 'age')>
[('Alice', 18), ('Bob', 19)]
[Row(name='Alice', age=18), Row(name='Bob', age=19)]
4. 提前指定rdd为Row格式
以下这种方式与上面一种方式很接近,只不过提前将rdd中元素的结构信息定义好:
from pyspark.sql import Rowrow = Row("name", "age")
sc = spark.sparkContext
rdd = sc.parallelize([row('Alice', 18), row('Bob', 19)])
df = rdd.toDF()
df.show()
结果如下:
+-----+---+
| name|age|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
5. rdd转dataframe
除了上面的几种方法,还有一种比较简单的方法,先创建一个rdd,然后将rdd转为dataframe,不过需要给rdd添加一下schema信息,如下:
value = [('Alice', 18), ('Bob', 19)]
rdd = spark.sparkContext.parallelize(value)
schema = "name: string, age: int"
df = rdd.toDF(schema)
df.show()
结果前面的相同:
+-----+---+
| name|age|
+-----+---+
|Alice| 18|
| Bob| 19|
+-----+---+
四、创建空dataframe
除了创建有数据的dataframe,在实际项目过程中,难免会碰到一些情况:初始化的时候需要创建一个空的dataframe,有以下两种方式创建。
1. 依据指定schema创建
这个方式其实是通过一个空的rdd来创建dataframe,必须要指定schema内容,否则会报错:
schema = "name: string, age: int"
df = spark.createDataFrame(spark.sparkContext.emptyRDD(), schema)
df.show()
df.printSchema()
结果如下所示,我们可以看到,用字符串的形式指定的schema信息,默认都是nullable的:
+----+---+
|name|age|
+----+---+
+----+---+root|-- name: string (nullable = true)|-- age: integer (nullable = true)
而如果我们想要手动指定列不为nullable的,则可以用以下方式指定schema:
from pyspark.sql.types import *
schema = StructType([StructField("name", StringType(), False),StructField("age", IntegerType(), False)])
df = spark.createDataFrame(spark.sparkContext.emptyRDD(), schema)
df.show()
df.printSchema()
结果如下所示:
+----+---+
|name|age|
+----+---+
+----+---+root|-- name: string (nullable = false)|-- age: integer (nullable = false)
2. 依据已有dataframe创建
这个方式其实本质上与上一种方式没有什么不同,只是可以通过已有的dataframe获取schema信息:
value = [('Alice', 18), ('Bob', 19)]
df = spark.createDataFrame(value, ['name', 'age'])
df2 = spark.createDataFrame(spark.sparkContext.emptyRDD(), df.schema)
print(df.schema)
df2.show()
结果如下:
StructType(List(StructField(name,StringType,true),StructField(age,LongType,true)))
+----+---+
|name|age|
+----+---+
+----+---+
从df.schema
的结果我们可以看到,这个schema信息与我们手动创建的shcema结构其实是一致的,而这样可以省去自己手动创建的麻烦。
pyspark--创建DataFrame相关推荐
- pySpark创建DataFrame的方式
pySpark创建DataFrame的方式 有时候需要在迭代的过程中将多个dataframe进行合并(union),这时候需要一个空的初始dataframe.创建空dataframe可以通过spark ...
- PySpark之DataFrame的常用函数(创建、查询、修改、转换)
import findspark findspark.init()from pyspark import SparkContext sc = SparkContext.getOrCreate()fro ...
- Pyspark 读 DataFrame 的使用与基本操作
一.安装 基于 mac 操作系统 安装 jdk jdk 下载地址 安装 pyspark pip install pyspark 二.读取 HDFS 文件 读 json 注意,如果是多行的 json,需 ...
- pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)
pandas创建内容全是0的dataframe.pandas基于随机整数.随机浮点数创建dataframe(random numbers) 目录 pandas创建内容全是0的dataframe.pan ...
- Spark _24 _读取JDBC中的数据创建DataFrame/DataSet(MySql为例)(三)
两种方式创建DataSet 现在数据库中创建表不能给插入少量数据. javaapi: package SparkSql;import org.apache.spark.SparkConf; impor ...
- Spark _22 _创建DataFrame的几种方式(一)
创建DataFrame的几种方式 读取json格式的文件创建DataFrame 注意: json文件中的json数据不能嵌套json格式数据. DataFrame是一个一个Row类型的RDD,df.r ...
- Spark创建DataFrame的三种方法
跟关系数据库的表(Table)一样,DataFrame是Spark中对带模式(schema)行列数据的抽象.DateFrame广泛应用于使用SQL处理大数据的各种场景.创建DataFrame有很多种方 ...
- Pandas创建DataFrame对象的几种常用方法
DataFrame是pandas常用的数据类型之一,表示带标签的可变二维表格.本文介绍如何创建DataFrame对象,后面会陆续介绍DataFrame对象的用法. 首先,使用pip.conda或类似工 ...
- 已解决pandas创建DataFrame对象失败
已解决(pandas创建DataFrame对象失败)ValueError: Shape of passed values is (1509, 1), indices imply (1509, 2) 文 ...
- SparkSQL 创建 DataFrame 的方式
1.读取 json 格式的文件创建 DataFrame 注意: 可以两种方式读取 json 格式的文件. df.show()默认显示前 20 行数据. DataFrame 原生 API 可以操作 Da ...
最新文章
- 正式环境docker部署hyperf_Hyperf使用docker-compose集群部署
- 安卓application_阿里面试官刁钻连问:安卓 UID的分配、查看及相关知识
- Common sql statement
- android 启动器开发,Android启动器(Launcher)开发详解
- unity调整旋转需要传什么参数?参数在数学上叫做什么?_人脸识别背后,卷积神经网络的数学原理原来是这样的...
- SSH框架配置及Maven使用
- 领域应用 | HiTA知识图谱 “药品-适应证”图谱数据发布!
- 自然语言处理常用标识符<UNK>,<PAD>,<SOS>,<EOS>等
- d3 svg path添加文本_数据可视化——D3展现数据最炫丽的一面
- python基础之centos7源码安装python3
- spring mvc实现ajax 分页
- 也用 Log4Net 之走进Log4Net (四)
- 蓝牙 - BQB认证测试
- 计算机电源 3842,UC3842开关电源保护的几个技巧及电路图
- android 市场 上传,安卓市场APP上传流程及审核要求
- linux拷贝文件前几行,Linux显示文件前几行、拷贝文件前几行、删除文件前几列...
- 2022年国内外大数据工程师薪资大比拼
- 用python实现自动化办公------定时发送微信消息
- 魅族应用商店云端架构实践
- mysql datasource property_spring配置datasource三种方式