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()