coalesce函数_pyspark常用函数

本文介绍了PySpark中coalesce函数的使用,包括如何添加新列、获取dataframe大小、合并dataframe、展开数据行、保存为HDFS Parquet格式以及执行SQL查询等核心操作。此外,还展示了根据条件设置列值、计算分位数来过滤异常值的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1ca81247fb77b5147972f1c230ab7990.png

添加新的一列

new_col_name 是新的一列的名字,F.lit(1)是全部都为 1 的一列,可以改成其他可以返回列的表达式

df = df.withColumn('new_col_name', F.lit(1))

输出dataframe的大小

print("df.shape :", df.count(), len(df.columns))

按行合并两个datafeame

两个df必须要有相同的columns

df_concat = df1.union(df2)

将一行展开为多行

假设有这样一张表

+------------+---+-----------+
|        name|age|      score|
+------------+---+-----------+
|        jack| 10| 11,22,33,4|
|xiaochouchuo| 20|       12,3|
|  dachouchou| 30| 212,555,52|
|      yuyuyu| 40|        2,5|
+------------+---+-----------+

希望将它按score展开为

+------------+---+-----+
|        name|age|score|
+------------+---+-----+
|        jack| 10|   11|
|        jack| 10|   22|
|        jack| 10|   33|
|        jack| 10|    4|
|xiaochouchuo| 20|   12|
|xiaochouchuo| 20|    3|
|  dachouchou| 30|  212|
|  dachouchou| 30|  555|
|  dachouchou| 30|   52|
|      yuyuyu| 40|    2|
|      yuyuyu| 40|    5|
+------------+---+-----+

可以这样做

df.withColumn('score', F.explode(F.split(df.score, ','))).show()

这行代码的意思是,将score按照 ',' 分割,然后对分割后的数组每个元素都 explode 为一行

dataframe保存为hdfs parquet格式

df.coalesce(10).write.mode("overwrite").save(output_path, format='parquet')

coalesce(10) 分割成10份保存;mode("overwrite") 若已存在文件,则覆盖;format='parquet' 保存为parquet格式(该格式比较省空间)

pyspark读取csv|parquet|json文件

先创建会话

from pyspark.sql import session
session = session.SparkSession 
            .builder 
            .appName(self.app_name) 
            .enableHiveSupport() 
            .getOrCreate()
  • 读取csv

session.read.csv(path)

  • 读取parquet

session.read.parquet(path)

  • 读取json

session.read.json(path)

  • 读取text

session.read.text(path)

执行sql查询,并返回dataframe

from pyspark.sql import session
session = session.SparkSession 
            .builder 
            .appName(self.app_name) 
            .enableHiveSupport() 
            .getOrCreate()
df = session.sql(sql)

根据条件设置列的值

比如,将num列中,值小于100的设置为0,大于100保持不变

import pyspark.sql.functions as F
df = df.withColumn('col_name', F.when(df.num < 100, 0).otherwise(df.num))

求分位数|四分位数过滤异常值

df = df.withColumn('col_name', df['col_name'].cast(DoubleType()))
quantiles = df.approxQuantile('col_name', [0.25, 0.75], 0.05)
IQR = quantiles[1] - quantiles[0]
min_value = quantiles[0] - 1.5 * IQR
max_value = quantiles[1] + 1.5 * IQR
if min_value < 0:
    min_value = 0
print "-" * 50 + "quantiles:", 'col_name', quantiles, "min_value,max_value", min_value, max_value
outlier_feature_dict['col_name'] = str(min_value) + '_' + str(max_value) + "_0_-911"

df = df.withColumn('col_name',
                        F.when(F.col('col_name') < min_value, min_value)
                        .otherwise(F.when(F.col('col_name') > max_value, max_value)
                                    .otherwise(F.col('col_name'))))

使用自定义函数

def myfunc(val):
    pass
df = df.withColumn('col_name', F.udf(myfunc, returnType=DoubleType())('col_name')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值