先放上pyspark.sql.DataFrame的函數彙總
from pyspark.sql import SparkSession
spark = SparkSession.Builder().master('local').appName('learnDataFrame').getOrCreate()
從文件中讀取數據,創建DataFrame
df = spark.read.csv('../data/data.csv', header='True')
# 查看各個列的數據類型
df.printSchema()
root
|-- _c0: string (nullable = true)
|-- 對手: string (nullable = true)
|-- 勝負: string (nullable = true)
|-- 主客場: string (nullable = true)
|-- 命中: string (nullable = true)
|-- 投籃數: string (nullable = true)
|-- 投籃命中率: string (nullable = true)
|-- 3分命中率: string (nullable = true)
|-- 籃板: string (nullable = true)
|-- 助攻: string (nullable = true)
|-- 得分: string (nullable = true)
from pyspark.sql.types import IntegerType, FloatType
# withColumns: 爲DataFrame增加新的列,如果列名存在,則替換已存在的列
df = df.withColumn('命中', df['命中'].cast(IntegerType()))
df = df.withColumn('投籃數', df['投籃數'].cast(IntegerType()))
df = df.withColumn('投籃命中率', df['投籃命中率'].cast(FloatType()))
df = df.withColumn('3分命中率', df['3分命中率'].cast(FloatType()))
df = df.withColumn('籃板', df['籃板'].cast(IntegerType()))
df = df.withColumn('助攻', df['助攻'].cast(IntegerType()))
df = df.withColumn('得分', df['得分'].cast(IntegerType()))
df.printSchema()
root
|-- _c0: string (nullable = true)
|-- 對手: string (nullable = true)
|-- 勝負: string (nullable = true)
|-- 主客場: string (nullable = true)
|-- 命中: integer (nullable = true)
|-- 投籃數: integer (nullable = true)
|-- 投籃命中率: float (nullable = true)
|-- 3分命中率: float (nullable = true)
|-- 籃板: integer (nullable = true)
|-- 助攻: integer (nullable = true)
|-- 得分: integer (nullable = true)
# 打印數據的2行
df.show(2)
+---+----+----+------+----+------+----------+---------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+---------+----+----+----+
| 0|勇士| 勝| 客| 10| 23| 0.435| 0.444| 6| 11| 27|
| 1|國王| 勝| 客| 8| 21| 0.381| 0.286| 3| 9| 27|
+---+----+----+------+----+------+----------+---------+----+----+----+
only showing top 2 rows
df.explain
<bound method DataFrame.explain of DataFrame[_c0: string, 對手: string, 勝負: string, 主客場: string, 命中: int, 投籃數: int, 投籃命中率: float, 3分命中率: float, 籃板: int, 助攻: int, 得分: int]>
agg
聚合函數,等價於pandas中的df.groupby().agg()
# 求得分的均值
ans = df.agg({'得分': 'mean'}).collect()
ans
[Row(avg(得分)=32.04)]
alias
返回帶有別名集的新DataFrame。
df2 = df.alias('df1')
approxQuantile
計算DataFrame的數字列的近似分位數
quantile_25 = df.approxQuantile('得分', (0.25, ), 0.01)
quantile_25
[27.0]
df.coalesce(numPartitions=1)
DataFrame[_c0: string, 對手: string, 勝負: string, 主客場: string, 命中: int, 投籃數: int, 投籃命中率: float, 3分命中率: float, 籃板: int, 助攻: int, 得分: int]
# 查看DataFrame所有的列名
df.columns
['_c0', '對手', '勝負', '主客場', '命中', '投籃數', '投籃命中率', '3分命中率', '籃板', '助攻', '得分']
corr(col1, col2, method=None)
計算兩個數值型列的相關性,目前僅支持persion相關係數。
# 計算3分命中率 和 得分的相關性
df.corr('3分命中率', '得分')
0.776918459184134
count()
返回DataFrame的行數
df.count()
25
cov(col1, col2)
計算兩個指定列的協方差,與DataFrameStatFunctions.cov()相同
df.cov('3分命中率', '得分')
1.0428483147422474
createGlobalTempView(name)
創建全局臨時視圖,此臨時視圖的生命週期與此Spark應用程序相關,如果已經存在同名的視圖,則拋出 TempTableAlreadyExistsException
df.createGlobalTempView('df')
createOrReplaceGlobalTempView(name)
創建全局臨時視圖,如果存在同名視圖,則替換同名視圖,視圖生命週期與Spark應用程序相關
df.createOrReplaceGlobalTempView('df')
createOrReplaceTempView(name)
創建局部臨時視圖,該臨時表的生命週期與SparkSession綁定在一起
df.createOrReplaceTempView('df')
createTempView(name)
創建局部臨時視圖,該臨時表的生命週期與SparkSession綁定在一起,如果已經存在同名的視圖,則拋出 TempTableAlreadyExistsException
df.createTempView('df')
crossJoin()
返回兩個DataFrame的笛卡爾積
df.columns
['_c0', '對手', '勝負', '主客場', '命中', '投籃數', '投籃命中率', '3分命中率', '籃板', '助攻', '得分']
df1 = df.select('_c0', '對手')
df2 = df.select('_c0', '勝負')
df_crossjoin = df1.crossJoin(df2)
df_crossjoin.show(10)
+---+----+---+----+
|_c0|對手|_c0|勝負|
+---+----+---+----+
| 0|勇士| 0| 勝|
| 0|勇士| 1| 勝|
| 0|勇士| 2| 勝|
| 0|勇士| 3| 負|
| 0|勇士| 4| 勝|
| 0|勇士| 5| 勝|
| 0|勇士| 6| 負|
| 0|勇士| 7| 負|
| 0|勇士| 8| 勝|
| 0|勇士| 9| 勝|
+---+----+---+----+
only showing top 10 rows
crosstab(col1, col2)
計算給定列的成對頻率表
cube(*cols)
使用指定的列爲當前DataFrame創建多維多維數據集,因此我們可以在它們上運行聚合
describe(*cols)
計算數字和字符串列的統計信息
df.describe(['對手', '命中', '投籃數']).show()
+-------+----+------------------+------------------+
|summary|對手| 命中| 投籃數|
+-------+----+------------------+------------------+
| count| 25| 25| 25|
| mean|null| 9.8| 21.16|
| stddev|null|3.0138568866708537|3.3501243758005956|
| min|76人| 6| 15|
| max|黃蜂| 19| 29|
+-------+----+------------------+------------------+
distinct()
按行去重,返回去重後的DataFrame
tmp_df = df.select(['主客場', '命中']).distinct()
tmp_df.show()
+------+----+
|主客場|命中|
+------+----+
| 客| 16|
| 客| 10|
| 主| 10|
| 客| 12|
| 主| 8|
| 客| 9|
| 客| 6|
| 主| 11|
| 主| 6|
| 客| 13|
| 客| 8|
| 主| 13|
| 主| 12|
| 主| 19|
+------+----+
drop(*cols)
刪除指定的行,返回刪除後的DataFrame
df1 = df.alias('df1')
df1 = df1.drop('命中', '得分')
df1.show(2)
+---+----+----+------+------+----------+-------------------+----+----+
|_c0|對手|勝負|主客場|投籃數|投籃命中率| 3分命中率|籃板|助攻|
+---+----+----+------+------+----------+-------------------+----+----+
| 0|勇士| 勝| 客| 23| 0.435| 0.444| 6| 11|
| 1|國王| 勝| 客| 21| 0.381|0.28600000000000003| 3| 9|
+---+----+----+------+------+----------+-------------------+----+----+
only showing top 2 rows
df.show(2)
+---+----+----+------+----+------+----------+-------------------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率| 3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+-------------------+----+----+----+
| 0|勇士| 勝| 客| 10| 23| 0.435| 0.444| 6| 11| 27|
| 1|國王| 勝| 客| 8| 21| 0.381|0.28600000000000003| 3| 9| 27|
+---+----+----+------+----+------+----------+-------------------+----+----+----+
only showing top 2 rows
dropDuplicates(subset=None)
返回刪除重複行的DataFrame,可以考慮只根據某些行去重。與drop_Duplicates()功能相同
df1 = df.dropDuplicates(subset=['勝負', '主客場'])
df1.show()
+---+----+----+------+----+------+----------+---------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+---------+----+----+----+
| 0|勇士| 勝| 客| 10| 23| 0.435| 0.444| 6| 11| 27|
| 6|灰熊| 負| 客| 6| 19| 0.316| 0.222| 4| 8| 20|
| 3|灰熊| 負| 主| 8| 20| 0.4| 0.25| 5| 8| 22|
| 2|小牛| 勝| 主| 10| 19| 0.526| 0.462| 3| 7| 29|
+---+----+----+------+----+------+----------+---------+----+----+----+
dropna(how=‘any’, thresh=None, subset=None)
返回刪除含有空值的行,別名DataFrameNaFunctions.drop()
how: any, 刪除包含空的行
all, 刪除全部爲空的行、
thresh: 默認爲空,如果指定的話,刪除小閾值且非空的行
import numpy as np
import pandas as pd
tmp_df = spark.createDataFrame(pd.DataFrame({'a': [1, 2, np.nan], 'b': [2, np.nan, 5]}))
tmp_df.show()
+---+---+
| a| b|
+---+---+
|1.0|2.0|
|2.0|NaN|
|NaN|5.0|
+---+---+
tmp_df.dropna(how='any').show()
+---+---+
| a| b|
+---+---+
|1.0|2.0|
+---+---+
dtypes
返回列表類型,包含所有列的列名和他們的數據類型
df.dtypes
[('_c0', 'string'),
('對手', 'string'),
('勝負', 'string'),
('主客場', 'string'),
('命中', 'string'),
('投籃數', 'string'),
('投籃命中率', 'string'),
('3分命中率', 'string'),
('籃板', 'string'),
('助攻', 'string'),
('得分', 'string')]
explain(extended=False)
將(邏輯和物理)計劃打印到控制檯以進行調試
df.explain(extended=False)
== Physical Plan ==
*(1) FileScan csv [_c0#2232,對手#2233,勝負#2234,主客場#2235,命中#2236,投籃數#2237,投籃命中率#2238,3分命中率#2239,籃板#2240,助攻#2241,得分#2242] Batched: false, Format: CSV, Location: InMemoryFileIndex[file:/D:/demo/studyProj/spark/data/data.csv], PartitionFilters: [], PushedFilters: [], ReadSchema: struct<_c0:string,對手:string,勝負:string,主客場:string,命中:string,投籃數:string,投籃命中率:string,3分命中率:string,籃...
fillna(value, subset=None)
填充缺失值,別名na.fill().DataFrame.fillna()和DataFrameNaFunctions.fill()。
value: int,long, float, string. or dict, 如果爲字典類型,則key爲列名,value爲對應列的填充值
subset:可選的列名
tmp_df = spark.createDataFrame(pd.DataFrame({'a': [1, 2, np.nan], 'b': [2, np.nan, 5]}))
tmp_df.fillna({'a': 100, 'b': 200}).show()
+-----+-----+
| a| b|
+-----+-----+
| 1.0| 2.0|
| 2.0|200.0|
|100.0| 5.0|
+-----+-----+
filter(condition)
根據給定的條件過濾行,與where()功能相同
df.filter(df['命中'] > 15).show()
+---+------+----+------+----+------+----------+------------------+----+----+----+
|_c0| 對手|勝負|主客場|命中|投籃數|投籃命中率| 3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+------------------+----+----+----+
| 10| 爵士| 勝| 主| 19| 25| 0.76| 0.875| 2| 13| 56|
| 23|開拓者| 勝| 客| 16| 29| 0.552|0.5710000000000001| 8| 3| 48|
+---+------+----+------+----+------+----------+------------------+----+----+----+
df.where(df['命中'] > 15).show()
+---+------+----+------+----+------+----------+------------------+----+----+----+
|_c0| 對手|勝負|主客場|命中|投籃數|投籃命中率| 3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+------------------+----+----+----+
| 10| 爵士| 勝| 主| 19| 25| 0.76| 0.875| 2| 13| 56|
| 23|開拓者| 勝| 客| 16| 29| 0.552|0.5710000000000001| 8| 3| 48|
+---+------+----+------+----+------+----------+------------------+----+----+----+
first()
返回第一行作爲一個Row
t = df.first()
type(t)
pyspark.sql.types.Row
foreach(f)
對DataFrame的所有行執行函數操作,等價於df.rdd.foreach()
foreachPartition(f)
將f函數應用於此DataFrame的每個分區。
freqItems(cols, support=None)
查找列的頻繁項
cols: 要計算重複項的列名,爲字符串類型的列表或者元祖。
support: 要計算頻率項的頻率值。默認是1%。參數必須大於1e-4.
df.freqItems(cols=['命中', '主客場'], support=0.9).show()
+--------------+----------------+
|命中_freqItems|主客場_freqItems|
+--------------+----------------+
| [8]| [客]|
+--------------+----------------+
groupBy(*cols)
按指定列分組,後面可以執行aggregation函數,等價於groupby()
df.groupBy(['主客場', '勝負']).agg({'得分': 'sum', '對手': 'count'}).show()
+------+----+---------+-----------+
|主客場|勝負|sum(得分)|count(對手)|
+------+----+---------+-----------+
| 主| 負| 89.0| 3|
| 客| 勝| 384.0| 12|
| 主| 勝| 308.0| 9|
| 客| 負| 20.0| 1|
+------+----+---------+-----------+
head(n=None)
返回DataFrame的前n行
df.head(3)
[Row(_c0='0', 對手='勇士', 勝負='勝', 主客場='客', 命中='10', 投籃數='23', 投籃命中率='0.435', 3分命中率='0.444', 籃板='6', 助攻='11', 得分='27'),
Row(_c0='1', 對手='國王', 勝負='勝', 主客場='客', 命中='8', 投籃數='21', 投籃命中率='0.381', 3分命中率='0.28600000000000003', 籃板='3', 助攻='9', 得分='27'),
Row(_c0='2', 對手='小牛', 勝負='勝', 主客場='主', 命中='10', 投籃數='19', 投籃命中率='0.526', 3分命中率='0.462', 籃板='3', 助攻='7', 得分='29')]
intersect(other)
返回兩個DataFrame交集組成的DataFrame
join(other, on=None, how=None)
根據指定列,用指定方法連接兩個DataFrame
limit(num)
將結果計數限制爲指定的數量
df.limit(3).show()
+---+----+----+------+----+------+----------+-------------------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率| 3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+----------+-------------------+----+----+----+
| 0|勇士| 勝| 客| 10| 23| 0.435| 0.444| 6| 11| 27|
| 1|國王| 勝| 客| 8| 21| 0.381|0.28600000000000003| 3| 9| 27|
| 2|小牛| 勝| 主| 10| 19| 0.526| 0.462| 3| 7| 29|
+---+----+----+------+----+------+----------+-------------------+----+----+----+
orderBy(*cols, **kwargs)
根據指定列排序,返回排好序的DataFrame
cols:用來排序的列或列名稱的列表。
ascending:布爾值或布爾值列表(默認 True). 升序排序與降序排序。指定多個排序順序的列表。如果指定列表, 列表的長度必須等於列的長度
# 按得分降序,投籃數升序排列
df.orderBy(['得分', '投籃數'], ascending=[False, True]).show(5)
+---+------+----+------+----+------+----------+------------------+----+----+----+
|_c0| 對手|勝負|主客場|命中|投籃數|投籃命中率| 3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+------------------+----+----+----+
| 10| 爵士| 勝| 主| 19| 25| 0.76| 0.875| 2| 13| 56|
| 15| 太陽| 勝| 客| 12| 22| 0.545| 0.545| 2| 7| 48|
| 23|開拓者| 勝| 客| 16| 29| 0.552|0.5710000000000001| 8| 3| 48|
| 12| 灰熊| 勝| 主| 11| 25| 0.44| 0.429| 4| 8| 38|
| 14| 猛龍| 負| 主| 8| 25| 0.32| 0.273| 6| 11| 38|
+---+------+----+------+----+------+----------+------------------+----+----+----+
only showing top 5 rows
persist(storageLevel=StorageLevel(True, True, False, False, 1))
設置存儲級別以在第一次操作運行完成後保存其值,默認爲(memory_only_ser)
randomSplit(weights, seed=None)
根據給定的權重隨機劃分DataFrame
splits = df.randomSplit(weights=[0.2, 0.8], seed=7)
for s in splits:
print(s.count())
3
22
rdd
以Row的pyspark.RDD形式返回內容。
rdd = df.rdd
type(rdd)
pyspark.rdd.RDD
registerTempTable(name)
使用給定名稱將此RDD註冊爲臨時表
此臨時表的生存期與用於創建此DataFrame的SQLContext綁定在一起
df.registerTempTable('table')
df1 = spark.sql("select '對手','勝負' from table") #
df1.show(5)
+----+----+
|對手|勝負|
+----+----+
|對手|勝負|
|對手|勝負|
|對手|勝負|
|對手|勝負|
|對手|勝負|
+----+----+
only showing top 5 rows
repartition(numPartitions, *cols)
按照給定的分區表達式分區,返回新的DataFrame。
產生的DataFrame是哈希分區。
numPartitions參數可以是一個整數來指定分區數,或者是一個列。如果是一個列,這個列會作爲第一個分區列。如果沒有指定,將使用默認的分區數。
replace(to_replace, value=None, subset=None)
返回用另外一個值替換了一個值的新的DataFrame。DataFrame.replace() 和 DataFrameNaFunctions.replace() 類似
rollup(*cols)
使用指定的列爲當前的DataFrame創建一個多維彙總,這樣可以聚合這些數據。
sample(withReplacement, fraction, seed=None)
返回DataFrame的子集採樣
df.sample(withReplacement=False, fraction=0.4, seed=4).show()
+---+----+----+------+----+------+------------------+-------------------+----+----+----+
|_c0|對手|勝負|主客場|命中|投籃數| 投籃命中率| 3分命中率|籃板|助攻|得分|
+---+----+----+------+----+------+------------------+-------------------+----+----+----+
| 4|76人| 勝| 客| 10| 20| 0.5| 0.25| 3| 13| 27|
| 5|黃蜂| 勝| 客| 8| 18| 0.444| 0.4| 10| 11| 27|
| 9|老鷹| 勝| 客| 8| 15|0.5329999999999999| 0.545| 3| 11| 29|
| 10|爵士| 勝| 主| 19| 25| 0.76| 0.875| 2| 13| 56|
| 15|太陽| 勝| 客| 12| 22| 0.545| 0.545| 2| 7| 48|
| 16|灰熊| 勝| 客| 9| 20| 0.45| 0.5| 5| 7| 29|
| 17|掘金| 勝| 主| 6| 16| 0.375|0.14300000000000002| 8| 9| 21|
| 19|籃網| 勝| 主| 13| 20| 0.65| 0.615| 10| 8| 37|
| 24|鵜鶘| 勝| 主| 8| 16| 0.5| 0.4| 1| 17| 26|
+---+----+----+------+----+------+------------------+-------------------+----+----+----+
sampleBy(col, fractions, seed=None)
根據每個層次上給出的分數,返回沒有替換的分層樣本。
schema
返回DataFrame的schema
df.schema
StructType(List(StructField(_c0,StringType,true),StructField(對手,StringType,true),StructField(勝負,StringType,true),StructField(主客場,StringType,true),StructField(命中,StringType,true),StructField(投籃數,StringType,true),StructField(投籃命中率,StringType,true),StructField(3分命中率,StringType,true),StructField(籃板,StringType,true),StructField(助攻,StringType,true),StructField(得分,StringType,true)))
select(*cols)
根據指定列名返回對應列構成的DataFrame
selectExpr(*expr)
投影一組SQL表達式並返回一個新的DataFrame。
tmp_df.selectExpr("a * 2", "abs(a)").show()
+-------+------+
|(a * 2)|abs(a)|
+-------+------+
| 2.0| 1.0|
| 4.0| 2.0|
| NaN| NaN|
+-------+------+
sort(*cols,**kwargs)
根據指定的列排序
df.sort(['得分'], ascending=False).show(10)
+---+------+----+------+----+------+----------+---------+----+----+----+
|_c0| 對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+------+----+------+----+------+----------+---------+----+----+----+
| 10| 爵士| 勝| 主| 19| 25| 0.76| 0.875| 2| 13| 56|
| 23|開拓者| 勝| 客| 16| 29| 0.552| 0.571| 8| 3| 48|
| 15| 太陽| 勝| 客| 12| 22| 0.545| 0.545| 2| 7| 48|
| 12| 灰熊| 勝| 主| 11| 25| 0.44| 0.429| 4| 8| 38|
| 14| 猛龍| 負| 主| 8| 25| 0.32| 0.273| 6| 11| 38|
| 19| 籃網| 勝| 主| 13| 20| 0.65| 0.615| 10| 8| 37|
| 18|尼克斯| 勝| 主| 12| 27| 0.444| 0.385| 2| 10| 37|
| 21| 湖人| 勝| 客| 13| 22| 0.591| 0.444| 4| 9| 36|
| 11| 騎士| 勝| 主| 8| 21| 0.381| 0.429| 11| 13| 35|
| 8|尼克斯| 勝| 客| 9| 23| 0.391| 0.353| 5| 9| 31|
+---+------+----+------+----+------+----------+---------+----+----+----+
only showing top 10 rows
sortWithinPartitions(*cols, **kwargs)
每個分區按指定的列排序
stat
返回一個DataFrameStatFunctoins
subtract(other)
subtract(other):返回一個新的DataFrame,這個DataFrame中包含的行不在另一個DataFrame中。這相當於SQL中的EXCEPT
take(num)
返回DataFrame的前num行
sortWithinPartitions(*cols, **kwargs)
返回一個新的DataFrame,每個分區按指定的列排序
summary()
df.select('勝負', '命中', '投籃數').summary('min', 'max', 'count').show()
+-------+----+----+------+
|summary|勝負|命中|投籃數|
+-------+----+----+------+
| min| 勝| 6| 15|
| max| 負| 19| 29|
| count| 25| 25| 25|
+-------+----+----+------+
toDF(*cols)
返回包含指定列的新的DataFrame
ndf = df.select("勝負", "命中", "投籃數").filter(df['投籃數'] == 21).toDF("勝負_", "命中_", "投籃數_")
ndf.show()
+-----+-----+-------+
|勝負_|命中_|投籃數_|
+-----+-----+-------+
| 勝| 8| 21|
| 負| 8| 21|
| 勝| 8| 21|
| 勝| 9| 21|
+-----+-----+-------+
toJSON(use_unicode=True)
將DataFrame轉換爲字符串類型的rdd
df_json = df.select("勝負", "命中", "投籃數").filter(df['投籃數'] == 21).toJSON()
df_json.collect()
['{"勝負":"勝","命中":8,"投籃數":21}',
'{"勝負":"負","命中":8,"投籃數":21}',
'{"勝負":"勝","命中":8,"投籃數":21}',
'{"勝負":"勝","命中":9,"投籃數":21}']
toLocalIterator(prefetchPartitions=False)
返回一個迭代器,該迭代器包含此DataFrame中的所有行
ndf = df.select("勝負", "命中", "投籃數").filter(df['投籃數'] == 21).toLocalIterator()
for row in ndf:
print(row)
Row(勝負='勝', 命中=8, 投籃數=21)
Row(勝負='負', 命中=8, 投籃數=21)
Row(勝負='勝', 命中=8, 投籃數=21)
Row(勝負='勝', 命中=9, 投籃數=21)
toPandas()
將pyspark DataFrame轉換爲pandas DataFrame
ndf = df.toPandas()
type(ndf)
pandas.core.frame.DataFrame
union(other)
兩個DataFrame的並集
df1 = df.select(["勝負", "命中", "投籃數"]).filter(df['投籃數'] > 25)
df2 = df.select(["勝負", "命中", "投籃數"]).filter(df['投籃數'] < 20)
print(df1.count(), df2.count())
ndf = df1.union(df2)
ndf.show()
2 7
+----+----+------+
|勝負|命中|投籃數|
+----+----+------+
| 勝| 12| 27|
| 勝| 16| 29|
| 勝| 10| 19|
| 勝| 8| 18|
| 負| 6| 19|
| 勝| 8| 15|
| 勝| 6| 16|
| 勝| 8| 19|
| 勝| 8| 16|
+----+----+------+
unionByName(other)
根據列名進行union
ndf.union(df2).distinct().show()
+----+----+------+
|勝負|命中|投籃數|
+----+----+------+
| 勝| 8| 18|
| 勝| 6| 16|
| 負| 6| 19|
| 勝| 8| 19|
| 勝| 12| 27|
| 勝| 16| 29|
| 勝| 8| 15|
| 勝| 10| 19|
| 勝| 8| 16|
+----+----+------+
withColumn(colName, col)
爲DataFrame增加一個列,如果DataFrame中已存在列名,則替換該列
# 增加一列,勝標記爲1 負標記爲0
from pyspark.sql import functions as F
df.withColumn('勝負_flag', F.when(df['勝負'] == '勝', 1).when(df['勝負'] == '負', 0)).show(5)
+---+----+----+------+----+------+----------+---------+----+----+----+---------+
|_c0|對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|勝負_flag|
+---+----+----+------+----+------+----------+---------+----+----+----+---------+
| 0|勇士| 勝| 客| 10| 23| 0.435| 0.444| 6| 11| 27| 1|
| 1|國王| 勝| 客| 8| 21| 0.381| 0.286| 3| 9| 27| 1|
| 2|小牛| 勝| 主| 10| 19| 0.526| 0.462| 3| 7| 29| 1|
| 3|灰熊| 負| 主| 8| 20| 0.4| 0.25| 5| 8| 22| 0|
| 4|76人| 勝| 客| 10| 20| 0.5| 0.25| 3| 13| 27| 1|
+---+----+----+------+----+------+----------+---------+----+----+----+---------+
only showing top 5 rows
withColumnRenamed(exciting, new)
通過重命名現有列來返回新的DataFrame
df.withColumnRenamed(existing='對手', new='比賽對手').show(3)
+---+--------+----+------+----+------+----------+---------+----+----+----+
|_c0|比賽對手|勝負|主客場|命中|投籃數|投籃命中率|3分命中率|籃板|助攻|得分|
+---+--------+----+------+----+------+----------+---------+----+----+----+
| 0| 勇士| 勝| 客| 10| 23| 0.435| 0.444| 6| 11| 27|
| 1| 國王| 勝| 客| 8| 21| 0.381| 0.286| 3| 9| 27|
| 2| 小牛| 勝| 主| 10| 19| 0.526| 0.462| 3| 7| 29|
+---+--------+----+------+----+------+----------+---------+----+----+----+
only showing top 3 rows
附上官方文檔的連接:http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame