1. col
#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
#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
#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
#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
#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
#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
#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
#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
#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
#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|
+-------+-----------+
"""