pyspark学习-spark.sql.functions normal函数

1. col
python 复制代码
#col(col)
"""
作用:返回一个基于已给列名的列信息
场景:类似于dataframe格式中提取data["id"],能够进行计算
参数:
    col:列名
    
返回:
    column:返回一个基于已给列名的列信息
"""

spark = SparkSession.builder.getOrCreate()

data = spark.range(3)

data.select(col("id").alias("id")).show()  #等价于:data.select(data["id"]).show()

data.select((col("id")+2).alias("id+2")).show()#可以计算

#输出结果
"""
+---+
| id|
+---+
|  0|
|  1|
|  2|
+---+

+----+
|id+2|
+----+
|   2|
|   3|
|   4|
+----+

"""
2. lit
python 复制代码
#lit(col)
"""
作用:利用常数创建新的dataframe列
场景:可以用于流数据输出batch,新增batch字段
参数:
    col:列,字符串,数字,布尔或者list类型
    
返回:
    column:常数列
"""

spark = SparkSession.builder.getOrCreate()

data = spark.range(3)

data.withColumn("batch",lit(3)).show()

#输出如下:
"""
+---+-----+
| id|batch|
+---+-----+
|  0|    3|
|  1|    3|
|  2|    3|
+---+-----+
"""
3. broadcast
python 复制代码
#broadcast(df)
"""
作用:Spark Broadcast是Spark中的一种优化技术,它允许开发人员在多个节点上缓存一个只读的变量,以便后 
     续的任务直接从缓存中读取,以减少网络传输和避免重复计算。
场景:在一个Spark作业中需要多次使用的只读变量
     变量较大,无法直接在内存中处理
     避免重复计算,提高作业的性能
参数:
    df:dataframe
    
返回:
     返回一个已经广播的变量。
"""

conf = SparkConf().setMaster("local[*]")
sc = SparkContext(conf=conf)
data = sc.parallelize([('苹果',12),('栗子',20),('香蕉',6),('牛肉',40)])
bc_data = sc.broadcast(data.collectAsMap())
data_name = sc.parallelize(['苹果','栗子','香蕉','牛肉'])
print(data_name.map(lambda x:bc_data.value[x]).collect())
#输出如下:
"""
[12, 20, 6, 40]
"""
4. coalesce
python 复制代码
#coalesce(cols)
"""
作用:返回多行中第一个非空值--->类似于sql中的case when colA is not null then colA when colA is null and colB is not null then colB when colA is null and colB is null then null
参数:
    cols:一个列或者多个列
    
返回:
     返回多行中第一个非空值,返回一列,无论cols是几列。
"""

spark = SparkSession.builder.getOrCreate()

data = spark.createDataFrame([(None,None),('tom',None),(None,13)],schema=['name','age'])

data.select(coalesce(data['name'], data['age']).alias('notNone')).show()
data.select(coalesce('name', 'age').alias('notNone')).show()
#输出如下:
"""
+-------+
|notNone|
+-------+
|   null|
|    tom|
|     13|
+-------+

"""
5. isnan
python 复制代码
#isnan(col)
"""
作用:判断列值是否为NaN
参数:
    col:列
    
返回:
     返回一个新的列,列数据为true或者false,如果为false代表该列该行数据为nan
"""

spark = SparkSession.builder.getOrCreate()

data = spark.createDataFrame([(str('nan'), float('nan'), str('nan')), ('tom', 32.0, 'male'), ('jack', float('nan'), 'female')],schema=['name', 'age', 'sex'])

data.select('name','age','sex',isnan('name').alias('name_nan'),isnan('age').alias('age_nan'),isnan('sex').alias('sex_nan')).show()

#输出如下:
"""
+----+----+------+--------+-------+-------+
|name| age|   sex|name_nan|age_nan|sex_nan|
+----+----+------+--------+-------+-------+
| nan| NaN|   nan|    true|   true|   true|
| tom|32.0|  male|   false|  false|  false|
|jack| NaN|female|   false|   true|  false|
+----+----+------+--------+-------+-------+
"""
6. isnull
python 复制代码
#isnull(col)
"""
作用:判断列值是否为None
参数:
    col:列
    
返回:
     返回一个新的列,列数据为true或者false,如果为false代表该列该行数据为none
"""

spark = SparkSession.builder.getOrCreate()

data = spark.createDataFrame([(None, None, None), ('tom', 32, 'male'), ('jack', None, 'female')],schema=['name', 'age', 'sex'])

data.select('name','age','sex',isnull('name').alias('name_null'),isnull('age').alias('age_null'),isnull('sex').alias('sex_null')).show()

#输出如下:
"""
+----+----+------+---------+--------+--------+
|name| age|   sex|name_null|age_null|sex_null|
+----+----+------+---------+--------+--------+
|null|null|  null|     true|    true|    true|
| tom|  32|  male|    false|   false|   false|
|jack|null|female|    false|    true|   false|
+----+----+------+---------+--------+--------+
"""
7. greatest/least
python 复制代码
#greatest(col*)
"""
作用:返回多列中每行最大值,如果存在多列,如果只有一列,返回一列最大值
参数:
    col*:列
    
返回:
     返回多列中每行最大值,如果存在多列,如果只有一列,返回一列最大值
"""
#least(col*)
"""
作用:返回多列中每行最小值,如果存在多列,如果只有一列,返回一列最小值
参数:
    col*:列
    
返回:
     返回多列中每行最小值,如果存在多列,如果只有一列,返回一列最小值
"""
#获取每个同学的最好科目成绩和最差科目成绩
spark = SparkSession.builder.getOrCreate()

data = spark.createDataFrame([('tom','english',55,'math',85),
                                  ('jack', 'english', 68, 'math', 59),
                                  ('jerry', 'english', 71, 'math', 62),
                                  ('bob', 'english', 82, 'math', 85),
                                  ('janny', 'english', 50, 'math', 92),
                                  ],schema=['name','english','score_1','math','score_2'])

data.select(greatest(data['score_1'],data['score_2']).alias('greatest')).show()
data.select(greatest(data['score_1'], data['score_2']).alias('least')).show()
#输出如下:
"""
+--------+
|greatest|
+--------+
|      85|
|      68|
|      71|
|      85|
|      92|
+--------+

+-----+
|least|
+-----+
|   85|
|   68|
|   71|
|   85|
|   92|
+-----+
"""
8. expr
python 复制代码
#expr(str)
"""
作用:将表达式字符串解析为它所表示的列
参数:
    str:字符串
    
返回:
     表示表达式的列
"""

spark = SparkSession.builder.getOrCreate()

data = spark.createDataFrame([('tom','english',55,'math',85),
                                  ('jack', 'english', 68, 'math', 59),
                                  ('jerry', 'english', 71, 'math', 62),
                                  ('bob', 'english', 82, 'math', 85),
                                  ('janny', 'english', 50, 'math', 92),
                                  ],schema=['name','english','score_1','math','score_2'])

data.select('name',expr("score_1+score_2 as scores")).show()
#输出如下:
"""
+-----+------+
| name|scores|
+-----+------+
|  tom|   140|
| jack|   127|
|jerry|   133|
|  bob|   167|
|janny|   142|
+-----+------+
"""
9. nanvl
python 复制代码
#nanvl(col1,col2):input必须是float或者double列
"""
作用:如果第一列非空,返回第一列,否则返回第二列数据
参数:
    col1:第一列
    col2:第二列
    
返回:
     如果第一列非空,返回第一列,否则返回第二列数据
"""

spark = SparkSession.builder.getOrCreate()

data = spark.createDataFrame([(float('nan'),float('nan')),(32.0,float('nan')),(float('nan'),13.0)],schema=['col1','col2'])

data.select(nanvl(data['col1'], data['col2']).alias('notNone')).show()
#输出如下:
"""
+-------+
|notNone|
+-------+
|    NaN|
|   32.0|
|   13.0|
+-------+

"""
10. when
python 复制代码
#when(condition,value):可以when接when
"""
作用:根据条件返回相对应的值,如果没有调用sql.column.otherwise(),则对于不匹配的条件返回None
参数:
    condition:列的条件
    value:值
    
返回:
    根据条件返回相对应的值,如果没有调用otherwise(),则对于不匹配的条件返回None
"""
spark = SparkSession.builder.getOrCreate()

data = spark.createDataFrame([('tom','english',55,'math',85),
                                  ('jack', 'english', 68, 'math', 59),
                                  ('jerry', 'english', 71, 'math', 62),
                                  ('bob', 'english', 82, 'math', 85),
                                  ('janny', 'english', 50, 'math', 92),
                                  ],schema=['name','english','score_1','math','score_2'])

data.select('score_1',when(data['score_1']>90,'A').when(data['score_1']>80,'B').when(data['score_1']>70,'C').otherwise('D').alias('score_grade')).show()


data.withColumn("score_grade",when(data['score_1']>90,'A').when(data['score_1']>80,'B').when(data['score_1']>70,'C').otherwise('D'))

#输出如下:
"""
+-----------+
|score_1|score_grade|
+-------+-----------+
|     55|          D|
|     68|          D|
|     71|          C|
|     82|          B|
|     50|          D|
+-------+-----------+
"""
相关推荐
蚂蚁数据AntData10 小时前
流批一体向量化计算引擎 Flex 在蚂蚁的探索和实践
大数据·数据仓库·spark·数据库架构
lucky_syq1 天前
Spark和MapReduce之间的区别?
大数据·spark·mapreduce
lucky_syq1 天前
Hive SQL和Spark SQL的区别?
hive·sql·spark
lucky_syq2 天前
Spark和Hadoop之间的区别
大数据·hadoop·spark
NiNg_1_2342 天前
Spark常用的转化操作和动作操作详解
大数据·ajax·spark
岑梓铭3 天前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
Data跳动3 天前
Spark内存都消耗在哪里了?
大数据·分布式·spark
lucky_syq3 天前
流式处理,为什么Flink比Spark Streaming好?
大数据·flink·spark
goTsHgo3 天前
在 Spark 上实现 Graph Embedding
大数据·spark·embedding
程序猿小柒3 天前
【Spark】Spark SQL执行计划-精简版
大数据·sql·spark