PySpark CheatSheet-其他操作

1. PySpark DataFrame 按照條件過濾

使用where()或者filter(),不同條件先用括號括起來,然後連接的and用"&", or用"|", not用"~"。也可以把條件寫在一個String裏頭,裏面就用and、or,而且字段名稱不用帶引號。比如:

df=spark.createDataFrame([(101, 1, 16), (102, 2, 13)], ['ID', 'A', 'B'])
df2 = df.where(df.ID == 101)
df3 = df.where((df.ID == 101) & (df.A==1))
df4 = df.where("ID==101 and A==1")
df5 = df.where(df['ID'] = 101) 
from pyspark.sql.functions import col
df5 = df.where((col('ID') == 101) & (col('A')==1))

2. Spark DataFrame返回一列的所有不同值

步驟其實有點多:提取指定列->distinct()函數抽取所有不同值形成df->collect()命令形成list of rows->row訪問+列表生成式返回list

代碼如下。

df=spark.createDataFrame([(101, 1, 16), (102, 2, 13)], ['ID', 'A', 'B'])
unique_ID_df = df.select('ID').distinct()
unique_ID = [x['ID'] for x in unique_ID_df.collect()]

3. Spark DataFrame分組聚合操作,對不同的列進行不同的聚合處理

關鍵在於:groupBy指定分組字段,形成GroupedData之後,用pyspark.sql.function下的函數(或者你自己寫出來的聚合函數)來聚合,用alias命令來指定聚合後的新列名。

例子見下:

import pyspark.sql.functions as F
data = [(1, 2.0), (2, 3.0), (2, 4.5), (3,2.0)]
df = sc.parallelize(data).toDF(["x", "y"])
df2 = df.groupBy('x').agg(F.avg('y').alias('avg_y'), 
                          F.sum('y').alias('sum_y'), 
                          F.max('y').alias('max_y'))
# 下面是結果展示
df2.printSchema()
root
 |-- x: long (nullable = true)
 |-- avg_y: double (nullable = true)
 |-- sum_y: double (nullable = true)
 |-- max_y: double (nullable = true)
df2.show()
+---+-----+-----+-----+
|  x|avg_y|sum_y|max_y|
+---+-----+-----+-----+
|  1|  2.0|  2.0|  2.0|
|  3|  2.0|  2.0|  2.0|
|  2| 3.75|  7.5|  4.5|
+---+-----+-----+-----+

4. Spark DataFrame快速添加一列隨機數

from pyspark.sql.functions import rand

# 添加一列隨機數
df2 = df.withColumn("rand_num", rand())

# 刪除某一列
df3 = df2.drop("rand_num")

這個操作可以和repartition(n, "randnum")等方式配合,有助於解決部分數據傾斜的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章