PySpark部分函数使用方法(AWS)

1. 背景

 

最近使用PySpark做了一些数据处理,目前涉及到的函数有以下部分:

1.  toDF()

2. groupBy()

3. agg()

4. alias()

5. F.max()

6. printSchema()

7. show()

8. withColumn()

9. explode()

10. pivot()

11. select()

12. where()

13. join()

14. sparkDataFrame和python变量互转

15. 排序

16. 空值判断

17. 强转类型

18. 窗口中位数计算

19. 窗口平均数计算

2. 具体使用方法

2.1 加载环境

import sys
import time,datetime
from awsglue.transforms import Join
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from awsglue import DynamicFrame
from pyspark.sql import SparkSession, Row, functions
from pyspark.sql.functions import arrays_zip, col, explode
from pyspark.sql import functions as F

from pyspark.sql import Row 
from pyspark.sql.functions import from_unixtime, unix_timestamp, min, max 
from pyspark.sql.functions import current_date


glueContext = GlueContext(SparkContext.getOrCreate())

table_name = 'testir'

s3_schema = glueContext.create_dynamic_frame.from_catalog(database="ir_test_insight1", 
                                                        table_name=table_name, 
                                                        transformation_ctx = "schema", 
                                                        additional_options = {'recurse':True,'groupFiles': 'inPartition'})

2.2 使用方法

1.  toDF()

RDD的toDF()方法是用来从一个存在的RDD结构中创建一个DataFrame对象,因为RDD是一个分布式的 Java对象的集合,故它没有包含列的信息,因此DataFrame采用的是默认的列。

df_s3 = s3_schema.toDF()
df_s3.printSchema()
df_s3.show()

2. groupBy()

group by:主要用来对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录。可以添加聚合函数。

3. agg()

pyspark中的agg聚合运算应该才能达到聚合字段的目的, apply的运算都是一行一行的运算且并没有真实的聚合

4. alias()

起别名,相当于sql中的as,不过也可以使用as()代替

5. F.max()

这里的F是引用了spark sql包 详情见上面的代码from pyspark.sql import functions as F

max就是取最大值和sql中的语法是一样的

6. printSchema()

printSchema函数用于输出DataFrame的结构,即包含了哪些列,以及每一列的名称和类型等等

7. show()

show()就相当于python里面的print()将数据展示出来

但是一般只会展示前20条,()中可以传参,比如show(100)那就是展示前100条

8. withColumn()

pyspark中在该DF添加新列

9. explode()

10. pivot()

11. select()

选择某一列进行查看,和sql中的语法是一致的

12. where()

where是筛选过滤,另外一个就是filter()这两个都是筛选过滤

13. join()

将两个DF连接起来,跟sql中的inner join ,left join ,right join 结果是一样的

left join

from pyspark.sql import Row
rdd = sc.parallelize([Row(name='Alice', age=5, height=80),Row(name='Alice', age=10, height=80)])
df = rdd.toDF()
rdd1 = sc.parallelize([Row(name='Alice', weight=45)])
df1 = rdd1.toDF()
df.join(df1, ["name"], "left").show()
"""
+-----+---+------+------+                                                       
| name|age|height|weight|
+-----+---+------+------+
|Alice|  5|    80|    45|
|Alice| 10|    80|    45|
+-----+---+------+------+

"""
rdd2 = sc.parallelize([Row(name='Alice', weight=45), Row(name='Alice', weight=45)])
df2 = rdd2.toDF()
df.join(df2, ["name"], "left").show()
"""
+-----+---+------+------+                                                       
| name|age|height|weight|
+-----+---+------+------+
|Alice|  5|    80|    45|
|Alice|  5|    80|    45|
|Alice| 10|    80|    45|
|Alice| 10|    80|    45|
+-----+---+------+------+
"""

outer join

rdd = sc.parallelize([Row(name='Alice', age=5, height=80),Row(name='Bob', age=5, height=80)])
df = rdd.toDF()
rdd = sc.parallelize([Row(name='Alice', age=5, height=80),Row(name='Cycy', age=10, height=80)])
df1 = rdd.toDF()
df.join(df1, ["name"], "outer").show()
"""
+-----+----+------+----+------+                                                 
| name| age|height| age|height|
+-----+----+------+----+------+
| Cycy|null|  null|  10|    80|
|  Bob|   5|    80|null|  null|
|Alice|   5|    80|   5|    80|
+-----+----+------+----+------+
"""

rdd1 = sc.parallelize([Row(name='Alice', age=5, height=80),Row(name='Cycy', age=10, height=80)])
df2 = rdd1.toDF()
print df.join(df1, ["name"], "outer").join(df2, ["name"], "outer").show()
"""
+-----+----+------+----+------+----+------+                                     
| name| age|height| age|height| age|height|
+-----+----+------+----+------+----+------+
| Cycy|null|  null|  10|    80|  10|    80|
|  Bob|   5|    80|null|  null|null|  null|
|Alice|   5|    80|   5|    80|   5|    80|
+-----+----+------+----+------+----+------+
"""

14. sparkDataFrame和python变量互转

在sparkSQL编程的时候,经常需要获取DataFrame的信息,然后python做其他的判断或计算,比如获取dataframe的行数以判断是否需要等待,获取dataframe的某一列或第一行信息以决定下一步的处理,等等。

14.1 获取第一行的值,返回普通python变量

value = df.select('columns_name').first()[0]

# 由于 first() 返回的是 Row 类型,可以看做是dict类型,

# 在只有一列的情况下可以用 [0] 来获取值。

14.2 获取第一行的多个值,返回普通python变量

row = df.select('col_1', 'col_2').first()

col_1_value = row.col_1

col_2_value = row.col_2

# first() 返回的是 Row 类型,可以看做是dict类型,用 row.col_name 来获取值

14.3 获取一列的所有值,或者多列的所有值

rows= df.select('col_1', 'col_2').collect()

value = [[ row.col_1, row.col_2 ] for row in rows ]

# collect() 函数将分布式的dataframe转成local类型的 list-row 格式

15. 排序

data=df_data.filter(col('iTs')<=datetest).sort(desc("iTs")).limit(1)

 16. 空值判断

17. 强转类型

data_df = df.withColumn("Plays", df.call_time.cast('float'))

18. 窗口中位数计算

med = F.expr('percentile_approx(SeparatorElementDP, 0.5)')

ssss= Window().partitionBy('gSN').orderBy('iTs').rowsBetween(-2,2)
# test.select('gSN','iTs','SeparatorElementDP',mean('SeparatorElementDP').over(ssss).alias('SeparatorElementDP_1')).show()
df_i3_trip_warning.withColumn('med_val', med.over(ssss)).show()


df_i3_trip_warning.withColumn("list", collect_list("SeparatorElementDP").over(ssss)).withColumn("med_val",med.over(ssss)).show()

19. 窗口平均数计算

ssss= Window().partitionBy('gSN').orderBy('iTs').rowsBetween(-2,2)
df_i3_trip_warning.select('gSN','iTs','SeparatorElementDP',mean('SeparatorElementDP').over(ssss).alias('SeparatorElementDP_1')).show()

3.参考

13 SparkJoin

14 将datafram转换为List

16 空值判断

17 强制转换​​​​​​

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将Spring Cloud Function部署到AWS Lambda可以分为以下几个步骤: 1. 创建一个Java项目,并添加Spring Cloud Function和AWS Lambda的依赖。 2. 编写一个Lambda函数处理器类,实现AWS Lambda的RequestHandler接口。这个处理器类负责接收和处理来自AWS Lambda的事件请求,并将请求转发给Spring Cloud Function的函数接口。 3. 将项目打包成一个Jar文件,并上传到AWS Lambda。 4. 配置AWS Lambda的触发器,让它在某个事件发生时执行。 下面是一个简单的示例,演示如何将Spring Cloud Function部署到AWS Lambda: 1. 创建一个Maven项目,并添加以下依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-function-adapter-aws</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-aws-autoconfigure</artifactId> <version>2.3.2.RELEASE</version> </dependency> ``` 2. 编写一个Lambda函数处理器类: ```java import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import org.springframework.cloud.function.adapter.aws.SpringBootRequestHandler; public class MyLambdaFunctionHandler implements RequestHandler<String, String> { private final SpringBootRequestHandler<String, String> handler; public MyLambdaFunctionHandler() { handler = new SpringBootRequestHandler<>(MyFunction.class); } @Override public String handleRequest(String input, Context context) { return handler.handleRequest(input, context); } } ``` 这个类实现了AWS Lambda的RequestHandler接口,并将请求转发给Spring Boot Request Handler。MyFunction是你自己编写的函数接口实现类。 3. 将项目打包成一个Jar文件,并上传到AWS Lambda。 你可以使用Maven命令打包项目: ``` mvn package ``` 然后,将生成的Jar文件上传到AWS Lambda。 4. 配置AWS Lambda的触发器,让它在某个事件发生时执行。 你可以在AWS Lambda控制台上配置触发器,例如API Gateway、S3事件等。 以上就是将Spring Cloud Function部署到AWS Lambda的基本步骤。你可以根据自己的需求对Lambda函数进行配置和优化,以获得更好的性能和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值