目录

  • 一、通过列表创建
    • 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相关推荐

  1. pySpark创建DataFrame的方式

    pySpark创建DataFrame的方式 有时候需要在迭代的过程中将多个dataframe进行合并(union),这时候需要一个空的初始dataframe.创建空dataframe可以通过spark ...

  2. PySpark之DataFrame的常用函数(创建、查询、修改、转换)

    import findspark findspark.init()from pyspark import SparkContext sc = SparkContext.getOrCreate()fro ...

  3. Pyspark 读 DataFrame 的使用与基本操作

    一.安装 基于 mac 操作系统 安装 jdk jdk 下载地址 安装 pyspark pip install pyspark 二.读取 HDFS 文件 读 json 注意,如果是多行的 json,需 ...

  4. pandas创建内容全是0的dataframe、pandas基于随机整数、随机浮点数创建dataframe(random numbers)

    pandas创建内容全是0的dataframe.pandas基于随机整数.随机浮点数创建dataframe(random numbers) 目录 pandas创建内容全是0的dataframe.pan ...

  5. Spark _24 _读取JDBC中的数据创建DataFrame/DataSet(MySql为例)(三)

    两种方式创建DataSet 现在数据库中创建表不能给插入少量数据. javaapi: package SparkSql;import org.apache.spark.SparkConf; impor ...

  6. Spark _22 _创建DataFrame的几种方式(一)

    创建DataFrame的几种方式 读取json格式的文件创建DataFrame 注意: json文件中的json数据不能嵌套json格式数据. DataFrame是一个一个Row类型的RDD,df.r ...

  7. Spark创建DataFrame的三种方法

    跟关系数据库的表(Table)一样,DataFrame是Spark中对带模式(schema)行列数据的抽象.DateFrame广泛应用于使用SQL处理大数据的各种场景.创建DataFrame有很多种方 ...

  8. Pandas创建DataFrame对象的几种常用方法

    DataFrame是pandas常用的数据类型之一,表示带标签的可变二维表格.本文介绍如何创建DataFrame对象,后面会陆续介绍DataFrame对象的用法. 首先,使用pip.conda或类似工 ...

  9. 已解决pandas创建DataFrame对象失败

    已解决(pandas创建DataFrame对象失败)ValueError: Shape of passed values is (1509, 1), indices imply (1509, 2) 文 ...

  10. SparkSQL 创建 DataFrame 的方式

    1.读取 json 格式的文件创建 DataFrame 注意: 可以两种方式读取 json 格式的文件. df.show()默认显示前 20 行数据. DataFrame 原生 API 可以操作 Da ...

最新文章

  1. 正式环境docker部署hyperf_Hyperf使用docker-compose集群部署
  2. 安卓application_阿里面试官刁钻连问:安卓 UID的分配、查看及相关知识
  3. Common sql statement
  4. android 启动器开发,Android启动器(Launcher)开发详解
  5. unity调整旋转需要传什么参数?参数在数学上叫做什么?_人脸识别背后,卷积神经网络的数学原理原来是这样的...
  6. SSH框架配置及Maven使用
  7. 领域应用 | HiTA知识图谱 “药品-适应证”图谱数据发布!
  8. 自然语言处理常用标识符<UNK>,<PAD>,<SOS>,<EOS>等
  9. d3 svg path添加文本_数据可视化——D3展现数据最炫丽的一面
  10. python基础之centos7源码安装python3
  11. spring mvc实现ajax 分页
  12. 也用 Log4Net 之走进Log4Net (四)
  13. 蓝牙 - BQB认证测试
  14. 计算机电源 3842,UC3842开关电源保护的几个技巧及电路图
  15. android 市场 上传,安卓市场APP上传流程及审核要求
  16. linux拷贝文件前几行,Linux显示文件前几行、拷贝文件前几行、删除文件前几列...
  17. 2022年国内外大数据工程师薪资大比拼
  18. 用python实现自动化办公------定时发送微信消息
  19. 魅族应用商店云端架构实践
  20. mysql datasource property_spring配置datasource三种方式

热门文章

  1. 1718: 大鱼吃小鱼
  2. Mac 解决 gyp: No Xcode or CLT version detected! 报错
  3. gyp: No Xcode or CLT version detected 报错
  4. HTTP 422 状态码
  5. enq 命令的帮助.
  6. Java如何定义三维数组
  7. JqueryEasyUI教程
  8. 初步了解802.15.4协议与ZigBee
  9. 运算符 相与、相或、相异或、取反、左移、右移
  10. 微信开发者模式php,PHP实现模拟微信公众号开发者模式