pyspark dataframe使用方法汇总

Pyspark Dataframe

1.对spark数据帧中的不同列求和
df = df.withColumn('sum1', sum([df[col] for col in ["A.p1","B.p1"]]))

2.选择几列的方法
color_df.select('length','color').show()

3. when操作
from pyspark.sql.functions import when
# 1.case when age=2 then 3 else 4
df.select(when(df['age'] == 2, 3).otherwise(4).alias("age")).show()

# 2.case when age=2 when age=age+1 
df.select(when(df.age == 2, df.age + 1).alias("age")).show()

#case when age<2 then age+2 else age end
df.withColumn('age', when(df.age == 2, df.age + 1).otherwise(df2['age'])).show()


4.对其中大于1的值进行操作使其等于1 
df4=df4.withColumn('audio_3', when(df4.audio_3 == 2, df4.audio_3 - 1).otherwise(df4['audio_3']))

5.判断列是否为空,并将空赋值为0
er= er.withColumn('audio_1月', when(er.audio_1月.isNull(), 
lit('0')).otherwise(er.audio_1月))

6.对所有列求和,并赋值给新的一列
fg = er.withColumn('class_num', sum(er[col] for col in cool))
fg.columns

7.修改列名
fg = fg.withColumnRenamed('audio_1月', 'audio_1')
fg = fg.withColumnRenamed('audio_2月', 'audio_2')

8.增加新的一列,并赋值为1
df4 = df4.withColumn('audio',lit(1))


9.选择反转列列表 
df_output = df.select(df.columns[::-1])


10.对列表的顺序进行更改
原来的列表顺序为 c、b、a , 更改后为 a、b、c
代码:df_output = df.select('a','b','c')


Spark中对DataFrame的基础操作:列增加,列删除,行增加,列名更换,排序等等


行操作
 
可以使用select和selectExpr来操作DataFrame中的列
例如查询:DEST_COUNTRY,ORIGIN_COUNTRY

    val path="/Volumes/Data/BigData_code/data/flight-data/json/2015-summary.json"
    val dataDF = spark.read.format("json").load(path)
    val dataSelect = dataDF.select("DEST_COUNTRY_NAME", "ORIGIN_COUNTRY_NAME")
    dataSelect.show(2)
新增一列
判断目的国家和起飞国家是否是同一个。

    //创建一个新的列,用来表示目的国家和源国家是否是同一国家
    dataDF.selectExpr(
      "*", "(DEST_COUNTRY_NAME = ORIGIN_COUNTRY_NAME) as inCountry"
    ).show(30)
使用withColumn添加列
    //添加1列
    dataDF.withColumn("numberOne", lit(1)).show(10)
删除一列
    //删除列
    //方法1:
    dataDF.selectExpr("DEST_COUNTRY_NAME", "count").show(2)
    //方法2:
    dataDF.drop("ORIGIN_COUNTRY_NAME").show(2)
连接和追加行(联合操作)
注意:DataFrame是不可变的,这意味着用户不能追加行,只能将想要添加的行生成ROW对象,然后再生成DataFrame,再将两个DataFrame进行拼接

    dataDF.printSchema()
    //将需要连接的Schema赋值给需要创建的DataFrame中(因为两个DataFrame连接需要Schema模式相同)
    val mySchema = dataDF.schema
    //创建Row对象的list
    val rowList = List(Row("NewCountry", "OtherCountry", 2L), Row("NewCountry2", "OtherCountry", 5L))
    //创建RDD
    val myrdd = sc.makeRDD(rowList)
    //创建新的DataFrame
    val newDF = spark.createDataFrame(myrdd, mySchema)
    //将两者进行连接
    newDF.union(dataDF).show(20)
会用select语句,我们还可以使用系统预定义好的聚合函数来指定在整个DataFrame上的聚合操作。
    //使用系统已经有的函数,求所有数据的count的平均值,并求出有多少不同的目的国家
    dataDF.selectExpr("avg(count)", "count(distinct(DEST_COUNTRY_NAME))").show(2)
字面量
dataDF.select(expr("*"), lit(1).as("one")).show(3)
注意:无法一次性添加多个列。一次性添加多个列,可以先将新列生成一个DataFrame,然后再进行连接即可。

修改列名:
   //修改列的名字:
    //方法1:
    dataDF.select(expr("DEST_COUNTRY_NAME as dest"), expr("ORIGIN_COUNTRY_NAME"), expr("count")).show(2)
    //方法2:
    dataDF.selectExpr("DEST_COUNTRY_NAME as dect", "ORIGIN_COUNTRY_NAME", "count").show(2)
    //方法3:
    dataDF.withColumnRenamed("DEST_COUNTRY_NAME", "dest").show(2)
回到顶部
行操作
过滤行
在DataFrame上实现过滤有两种方法:

创建一个字符串表达式:使用where
通过列操作来构建表达式:使用filter
下面我们只要count<2的所有行
    val dataDF = spark.read.format("json").load(path)
    dataDF.where("count < 2").show(20)
多个条件之间的关系为‘and’时

dataDF.where("count > 2").where("count < 4").show(20)
去重操作
dataDF.selectExpr("DEST_COUNTRY_NAME", "ORIGIN_COUNTRY_NAME").distinct().show(20)
排序
    //排序
    //方法1:
    dataDF.sort("count", "DEST_COUNTRY_NAME").show(2)   //默认升序
    //方法2:
    dataDF.sort(asc("count"), desc("DEST_COUNTRY_NAME")).show(2)  //asc指定升序,desc指定降序
    //方法3:
    dataDF.sort(expr("count asc"), expr("DEST_COUNTRY_NAME desc")).show(2)
    //方法4:
    dataDF.orderBy(desc("count"), asc("DEST_COUNTRY_NAME")).show(2)
    //方法5:
    dataDF.orderBy(expr("count asc"), expr("DEST_COUNTRY_NAME desc")).show(2)
一个高级技巧是你可以指定空值在排序列表中的位置,使用asc_nulls_first指示空值安排在升序排列的前面,使用desc_nulls_first指示空值安排在降序排列的前面,使用asc_nulls_last指示空值安排在升序排列的后面,使用desc_nulls_last指示空值安排在降序排列的后面。
还有一种排序是分区内进行排序。这样做能够大大提高性能。使用的函数是sortWithinPartitions
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
pandas DataFrame 转换为 PySpark DataFrame方法通常有两种,一种是使用 PySpark 自带的 API,另一种是使用第三方库 PyArrow。下面分别介绍这两种方法方法1:使用 PySpark API 首先需要将 pandas DataFrame 转换为 PySpark DataFrame,可以使用 `createDataFrame()` 方法。这个方法需要两个参数,第一个参数是 pandas DataFrame,第二个参数是 PySpark DataFrame 的 schema。 示例代码如下: ```python from pyspark.sql import SparkSession import pandas as pd spark = SparkSession.builder.appName("pandas_to_spark").getOrCreate() # 创建一个 pandas DataFrame pdf = pd.DataFrame({ "name": ["Alice", "Bob", "Charlie"], "age": [25, 30, 35] }) # 将 pandas DataFrame 转换为 PySpark DataFrame sdf = spark.createDataFrame(pdf) sdf.show() ``` 输出结果如下: ``` +-------+---+ | name|age| +-------+---+ | Alice| 25| | Bob| 30| |Charlie| 35| +-------+---+ ``` 方法2:使用 PyArrow 首先需要安装 PyArrow 库,可以使用以下命令进行安装: ```bash pip install pyarrow ``` 然后使用 `from_pandas()` 方法将 pandas DataFrame 转换为 PySpark DataFrame。 示例代码如下: ```python from pyspark.sql import SparkSession import pandas as pd import pyarrow spark = SparkSession.builder.appName("pandas_to_spark").getOrCreate() # 创建一个 pandas DataFrame pdf = pd.DataFrame({ "name": ["Alice", "Bob", "Charlie"], "age": [25, 30, 35] }) # 将 pandas DataFrame 转换为 PySpark DataFrame sdf = spark.createDataFrame(pyarrow.Table.from_pandas(pdf)) sdf.show() ``` 输出结果与方法1相同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山林里的迷路人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值