pyspark之DataFrame操作大全

Spark SQL中的DataFrame類似於一張關係型數據表。在關係型數據庫中對單表或進行的查詢操作,在DataFrame中都可以通過調用其API接口來實現。

DataFrame().columns

from pyspark.sql import Row
df = sc.parallelize([ 
Row(name='Alice', age=5, height=80), 
Row(name='Alice', age=5, height=80), 
Row(name='Alice', age=10, height=80),
Row(name='yf',age='',height=60)]).toDF()
df.columns

以 list 的格式返回所有列名

DataFrame().distinct()

返回新的 df ,這個新的 df 不包含重複的數據

df.distinct().count()

DataFrame().drop()

返回一個新的 df ,丟棄掉指定的列

df.drop('height').collect()

[Row(age=5, name=u’Alice’), Row(age=5, name=u’Alice’), Row(age=10, name=u’Alice’), Row(age=None, name=u’yf’)]

DataFrame().dropDuplicates(subset=None)

返回一個新的 df ,這個 df 裏面不再有重複的記錄。可選參數可以讓我們選擇關心的字段進行去重

df.dropDuplicates().show()
df.dropDuplicates(['name', 'height']).show()

DataFrame().dropna(how=‘any’, thresh=None, subset=None)

how: any or all ,any 代表列中有任意數據爲空就會被過濾,all 代表所有列爲空纔會被過濾

df.dropna(how='all').show()

DataFrame().dtypes

df.dtypes

返回所有列名和其類型
[(‘age’, ‘bigint’), (‘height’, ‘bigint’), (‘name’, ‘string’)]

DataFrame().fillna(value, subset=None)

和na.fill() 互爲同名函數。

替換空值
value: 替換的值,可以是 int, long, float, string, or dict,如果是 dict 的話 key 應當是列值, value 應該是空值的替換值,如果是 dict 則 subset 不生效。
subset: 指定需要忽略替換的列。

#df.na.fill(16).show()
df.fillna(16).show()
df.fillna(16,subset='age').show()

在這裏插入圖片描述

DataFrame().describe()

df.describe().show()
df.describe(['age']).show()

在這裏插入圖片描述

DataFrame().filter(condition)

使用條件過濾where 和 filter 是同名函數

df.filter(df.age<9).collect()

[Row(age=5, height=80, name=u’Alice’), Row(age=5, height=80, name=u’Alice’)]

df.where(df.name=='yf').collect()

[Row(age=16, height=60, name=u’yf’)]

df.first()

返回第一條 df

DataFrame().groupBy(*col)

可以使用 agg 方法對其進行各種各樣的聚合

df.groupBy('name').agg({'age':'mean'}).collect()

[Row(name=u’Alice’, avg(age)=6.666666666666667), Row(name=u’yf’, avg(age)=16.0)]

df.groupBy(df.name).avg().collect()

[Row(name=u’Alice’, avg(age)=6.666666666666667, avg(height)=80.0), Row(name=u’yf’, avg(age)=16.0, avg(height)=60.0)]

sorted(df.groupBy(['name',df.age]).count().collect())

[Row(name=u’Alice’, age=5, count=2), Row(name=u’Alice’, age=10, count=1), Row(name=u’yf’, age=16, count=1)]

DataFrame().head(n=None)

返回頭幾個 df 默認情況是 1 如果超過1 會返回一個列表

df.head()
df.head(3)

DataFrame().join(other, on=None, how=None)

使用給定的條件和其他 df 進行 join。
other: 另外一個 df
how: inner,cross, outer, full, full_outer, left, left_outer, right, right_outer, left_semi, and left_anti

df.join(df2,df.name==df2.name,'outer').select(df.name,df.age,df2.hobby).collect()

[Row(name=u’Alice’, age=5, hobby=u’football’), Row(name=u’Alice’, age=5, hobby=u’football’), Row(name=u’Alice’, age=10, hobby=u’football’), Row(name=u’yf’, age=16, hobby=u’read book’)]

df.join(df2,df.name==df2.name,'outer').select(df.name,df.age,df2.hobby).show()

在這裏插入圖片描述

df.join(df2,[df.name==df2.name,df.age==df2.age],'outer').select(df.name,df.age,df.height,df2.hobby).show()

在這裏插入圖片描述

df.join(df2,[df.name==df2.name,df.age==df2.age],'inner').select(df.name,df.age,df.height,df2.hobby).show()

在這裏插入圖片描述

DataFrame().limit

限制拿多少條

df.join(df2,[df.name==df2.name,df.age==df2.age],'outer').select(df.name,df.age,df.height,df2.hobby).limit(2).show()

在這裏插入圖片描述

DataFrame().orderBy(*cols, **kwargs)

DataFrame().sort(*cols, **kwargs)

返回一個被指定 col 排序好的 df

df.sort("age",ascending=False).show()
df.sort(df.age.desc()).show()
df.orderBy(df.age.desc()).show()

在這裏插入圖片描述

DataFrame().printSchema()

打印出該 df 的 schema

df.printSchema()

在這裏插入圖片描述

DataFrame().registerTempTable()

createOrReplaceTempView 互爲同名函數

DataFrame().rdd()

將 df 轉換成 rdd 返回

DataFrame().repartition(numPartitions, *cols)

返回一個新的 df,這個新的 df 被給定的 numPartitions 數量進行 hash 重分區

data=df.repartition(7,'age').show()
data.rdd.getNumPartitions()

DataFrame().replace(to_replace, value=None, subset=None)

df.replace(16,26).show()

在這裏插入圖片描述
在這裏插入圖片描述

DataFrame().select(*cols)

df.select('name','hobby').show()

在這裏插入圖片描述

DataFrame().show(n=20, truncate=True)

打印前 n 行數據到控制檯

df.show(2)

DataFrame().toDF(*cols)

返回新的 df 根據 list 字段順序,字段數要保持一致

df.toDF('name','age','hobby','height').show()

在這裏插入圖片描述

DataFrame().toJSON(use_unicode=True)

df.toJSON().take(2)

[u’{“name”:“yf”,“age”:16,“height”:60,“hobby”:“read book”}’, u’{“name”:“Alice”,“age”:10,“height”:80,“hobby”:“football”}’]

DataFrame().toPandas()

將目前的 df 轉換成 pandas 的 df

DataFrame().union(other)

union 函數是 sql 函數 unionall 函數的功能。

DataFrame().withColumn(colName, col)

返回一個新的 df, 根據給定的 colName 和 col 本身增加一列。

df.withColumn('tel',df.age+2).show()

在這裏插入圖片描述

DataFrame().withColumnRenamed(existing, new)

返回一個新的 df 重命名現在已有的一個 col 名稱

df.withColumnRenamed('height','money').show()

在這裏插入圖片描述

DataFrame().write()

非流接口向外部存儲寫入數據

prop={"user":"rw_aps","password":"rw_aps.aac","driver":"com.mysql.jdbc.Driver"}
data_df.write.jdbc("jdbc:mysql://10.133.0.46:3306/aac_lens_analysis",'t_palo_status_test','append', prop)

DataFrame().writeStream()

流接口向外部存儲寫入數據

完整代碼

from pyspark.sql import Row
df = sc.parallelize([ 
Row(name='Alice', age=5, height=80), 
Row(name='Alice', age=5, height=80), 
Row(name='Alice', age=10, height=80),
Row(name='yf',age='',height=60)]).toDF()
df.columns
df.distinct().count()
df.drop('height').collect()
df.dropDuplicates().show()
df.dropna(how='all').show()
df.dtypes
df=df.fillna(16,subset='age')
df.describe().show()
df.filter(df.age<9).collect()
df.where(df.name=='yf').collect()
df.first()

df.groupBy('name').agg({'age':'mean'}).collect()

df.head()
df.head(3)

df2 = sc.parallelize([ 
Row(name='Alice',age=10, hobby='football'), 
Row(name='yf',age=16,hobby='read book')]).toDF()

df=df.join(df2,[df.name==df2.name,df.age==df2.age],'inner').select(df.name,df.age,df.height,df2.hobby)

df.sort(df.age.desc()).show()

df.printSchema()

df.replace(16,26).show()
df.select('name','hobby').show()

df.take(1)

df.show(2)

df.toDF('name','age','hobby','height').show()

df.toJSON().take(2)

df.withColumn('tel',df.age+2).show()

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