继上篇DF中agg介绍之后,继续极少DF methods
注册一个临时表:
- 1 createGlobalTempView :创建了一个全局的临时表
- 对应于dropGlobalTempView
spark.catalog.dropGlobalTempView("table_name")
- 对应于dropGlobalTempView
- 2.createOrReplaceTempView()& createTempView()
- 对应于
spark.catalog.dropGlobalTempView()
spark.catalog.dropTempView()
- 对应于
- 注册临时表之后,可以使用spark.sql()中对临时表写SQL语句,创建新的DF
from pyspark.sql import SparkSession
spark=SparkSession.bulider.getOrCreate()
#假设。。。我们已经有了一个DF
df.createGlobalTempView("temp_table")
df_anothor=spark.sql("select * from global_temp.temp_table")
#若是local的temp_table ,sql的方式
#df_local=spark.sql("select * from temp_table")
spark.catalog.dropGlobalTempView("temp_table")
统计描述
主要参考https://www.iteblog.com/archives/1382.html#Cross_tabulation
1 笛卡尔积 df1.crossJoin(df2)
返回两个df的交叉积(即笛卡尔积)
举个栗子
然栗子不好举,在声明df时遇到了一个错误
提示错误:
from pyspark.sql import SparkSession
spark=SparkSession.builder.getOrCreate()
data=[1,2,3,4,5]
df=spark.createDataFrame(data)
Can not infer schema for type:
但是createDataFrame 中说过,createDataFrame(data,schema) ,其中data可以是list,rdd,pandas.DF ;schema可以是变量名列表,显示定义的类型以及默认(自行推断)
so why error? 仔细阅读error can not info schema 那我们显示的来定义试一下
from pyspark.sql import SparkSession
from pyspark.sql.types import *
spark=SparkSession.builder.getOrCreate()
data=[1,2,3,4,5]
schema=IntegerType()
df=spark.createDataFrame(data,schema)
#work,done
说回正题 crossJoin
lst1=[1,2,3,4,5]
lst2=[2,3,4,5,6]
df1=spark.createDataFrame(lst1,IntegerType())
df2=spark.createDataFrame(lst2,IntegerType())
df_join=df1.crossJoin(df1)
df_join.show()
修改列名的问题
- crossJoin得到的结果df_join 如下:
可以看到列名是相同的,这对df使用是极不方便的。如何修改列名 ?
method of modify column’s name
- 1 withColumnRenamed
old_columns=df_join.schema.name
new_columns=["you can definate"]
df=reduce(lambda df_join,idx:data.withColumnRenamed(old_columns[idx],new_columns[idx]),xrange(len(old_columns)),df_join)
2 在join 之前需要修改列名
3 确定每个col实际上属于哪一个df 使用alias修改
df_new_join=df_join.select(df1.value.alias("v1"),df2.value.alias("v2"))
相关系数&协方差(corr,cov)
DF.corr(col_name1,col_name2)
DF.cov(col_name1,col_name2)
列联表 crosstab
- 作用: 统计某一个变量(y)各类中,制定特征x的分布。
from pyspark.sql.types import *
y=[1,0,1,0,1,1,0,0]
x=["a","a","c","a","b","b","c","a"]
data=[(y[i],x[i]) for i in xrange(len(x))]
df=spark.createDataFrame(data,["y","x"])
df.crosstab("y","x").show()
适合于特征的选择,查看x这维特征是否对y值有显著差别
频繁项
- 寻找某一列或者某几列的出现频繁的项,同时,多列联合的频繁项集也可以找出。
from pyspark.sql.Functions import struct
df.withColumns("xy",struct('y','x')).freqItems(["xy"],0.3).collect()