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")等方式配合,有助於解決部分數據傾斜的問題。