pyspark 条件_pyspark常用函数

添加新的一列

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')

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值