【pyspark】dataframe常用操作
pyspark中,dataframe與sql的耗時會經引擎優化,效率高於rdd。在使用dataframe過程中,應儘量避免使用udf,因為序列化資料原本在JVM中,現在spark在worker上啟動一個Python程式,需要將全體資料序列化成python可解釋的格式,計算昂貴。
列相關
- 根據已有列生成新列
from pyspark.sql.functions import length, col, lit
df.withColumn("length_col", length(col("existing_str_col"))) # 將existing_str_col的長度生成新列
df.withColumn("constant_col", lit("hello")) # 生成一列常量
- 從已有列選擇部分列
from pyspark.sql.functions import col
df = df.select(col("col_1").cast("string"), col("col_2").alias("col_2_")) # 選擇col_1列和col_2列,並將col_1列轉換為string格式,將col_2列重新命名為col_2_,此時不再存在col_2
- 將幾列連線起來形成新列
from pyspark.sql.functions import concat_ws
df = df.withColumn("concat_col", concat_ws("_", df.col_1, df.col_2)) # 使用_將col_1和col_2連線起來,構成新列concat_col
- 將string列分割成list
from pyspark.sql.functions import split
df = df.withColumn("split_col", split(df.col, "-")) #按照-將df中的col列分割,此時split_col時一個list,後續或者配合filter(length(...))使用
- 統計列均值
from pyspark.sql.functions import mean
col_mean = df.select(mean(col)).collect()[0][0]
行相關
- 從全體行中選擇部分行(一般除錯時使用)
print(df.take(5)) #互動式的pyspark shell中,等價於df.show(5)
- 統計行數量
print(df.count()) #統計行數量
- 從全體行中篩選出部分行
from pyspark.sql.functions import col
df = df.filter(col("col_1")==col("col_2")) #保留col_1等於col_2的行
- 刪除帶null的行
df.na.drop("all") # 只有當所有列都為空時,刪除該行
df.na.drop("any") # 任意列為空時,刪除該行
df.na.drop("all", colsubset=["col_1","col_2"]) # 當col_1和col_2都為空時,刪除該行
- 去除重複行
df = df.distinct()
- 一行拆分成多行
from pyspark.sql.functions import explode, split
df = df.withColumn("sub_str", explode(split(df["str_col"], "_"))) # 將str_col按-拆分成list,list中的每一個元素成為sub_str,與原行中的其他列一起組成新的行
- 填補行中的空值
df.na.fill({"col_name":fill_content}) # 用fill_content填補col_name列的空值
兩個dataframe
- 兩個dataframe根據某列拼接
df_3 = df_1.join(df_2, df_1.col_1==df_2.col_2) # inner join, 只有當df_1中的col_1列值等於df_2中的col_2時,才會拼接
df_4 = df_1.join(df_2, df_1.col_1==df_2.col_2, "left") # left join, 當df_1中的col_1值不存在於df_2中時,仍會拼接,憑藉值填充null
- 兩個dataframe合併
df3 = df1.union(df2)
聚合操作
groupBy
from pyspark.sql.functions import concat_ws, split, explode, collect_list, struct
concat_df = concat_df.groupBy("sample_id", "sample_date").agg(collect_list('feature').alias("feature_list")) # 將同sample_id, sample_date的行聚合成組,feature欄位拼成一個list,構成新列feature_list。agg配合groupBy使用,效果等於select。此時concat_df只有兩列:sample_id和feature_list。
concat_tuple_df = concat_df.groupBy("sample_id", "sample_date").agg(collect_list(struct("feature", "owner")).alias("tuple")) # 將同sample_id, sample_date的行聚合成組, (feature, owner)兩個欄位拼成一個單位,組內所有單位拼成一個list,構成新列tuple
視窗函式
from pyspark.sql.window import Window
from pyspark.sql.functions import col, row_number
windowSpec = Window.partitionBy(df.id, df.date).orderBy(col("price").desc(), col("discount").asc()) # 相同id,date的行被聚成組,組內按照price降序,discount升序進行排列
df = df.withColumn("rank", row_number().over(windowSpec)) #為排序之後的組進行組內編號
df = df.filter(df.rank<=1) # 取組內top-1行
dataframe轉SQL
from pyspark import SparkContext
from pyspark.sql import SparkSession
sc = SparkContext(appName='get_sample')
sc_session = SparkSession(sc)
sample_df.createOrReplaceTempView("item_sample_df")
sample_df = sc_session.sql(
'''
select sample_id
,label
,type_ as type
,split(item_id, "_")[2] as owner
,ftime
from item_sample_df
''')
自定義函式UDF(如非必要,勿用)
from pysprak.sql.functions import udf, col
from pyspark.sql.types import StringType
def my_func(v1, v2):
pass
my_udf = udf(my_func, StringType())
df = df.withColumn("new", my_udf(df["col_1"], df["col_2"]))
相關文章
- PySpark筆記(三):DataFrameSpark筆記
- PySpark DataFrame教程與演示Spark
- pyspark.sql.DataFrame與pandas.DataFrame之間的相互轉換SparkSQL
- panda dataframe的一些常用操作方法
- Pyspark資料基礎操作集合Spark
- 邏輯和物理計劃如何工作時讀蜂巢分割槽表在獸人pyspark dataframe嗎Spark
- pandas -- DataFrame的級聯以及合併操作
- 客快物流大資料專案(四十六):Spark操作Kudu dataFrame操作kudu大資料Spark
- PySpark 通過Arrow加速Spark
- pyspark底層淺析Spark
- PySpark-MongoDB ConnectorSparkMongoDB
- 常用sql 操作SQL
- git常用操作Git
- NumPy常用操作
- DOM常用操作
- Hive 常用操作Hive
- vim常用操作
- MySQL 常用操作MySql
- 常用git操作Git
- HDFS常用操作
- mysql常用操作MySql
- 常用位操作
- vi常用操作
- git 常用操作Git
- nerdctl 常用操作
- 常用操作 / 資料庫操作資料庫
- KVM的常用操作
- Git 常用基本操作Git
- Clion基本常用操作
- 常用Linux操作Linux
- Go - httpclient 常用操作GoHTTPclient
- Docker常用操作命令Docker
- redis 常用api操作RedisAPI
- Promethues的常用操作
- Docker 常用操作指令Docker
- Linux常用操作Linux
- Git:Git常用操作Git
- 常用操作 / 介面返回