Spark DataFrame 笔记
记录一些DataFrame的常用操作,防止之后自己忘记,也方便查阅
1. 给一个DataFrame添加ID列
在使用Spark mllib的CountVectorize时候,数据格式是
id | 内容 |
---|---|
0 | This is a sentence |
1 | This is also a sentence |
…… | …… |
但是很多时候,我们只有内容列,读入一个文本的时候,只有文本行,因此需要对文本添加ID列
解决办法,使用monotonically_increasing_id方法:
import org.apache.spark.sql.functions.monotonically_increasing_id
df.withColumn("id",monotonically_increasing_id())
这样就能实现添加列ID的目的
2. 筛选出DataFrame中重复值非常多的行
在DatFrame中有一个stat方法,可以统计每行的frequentItems
df.stat.freqItems(df.columns,0.95)
会统计出df中所有列中的重复值占比不低于95%的列,返回的是一个DataFrame的对象,该DataFrame上每个列名在原基础上加了_freqItems的后缀,这样很不方便,如果要去掉这些列,还需要进一步处理
3. 给每行的数据添加一个数据
在求进行频繁项集挖掘时,从数据源(CSV,DB……)中读取数据,得到一个DataFrame,然后需要将每个数据转换成feature=value的形式,如:
IP | COUNTRY | AGE |
---|---|---|
117.14.59.89 | China | 20 |
117.19.34.25 | UK | 21 |
…… | …… | …… |
转换为:
IP | COUNTRY | AGE |
---|---|---|
IP=117.14.59.89 | COUNTRY=China | AGE=20 |
IP=117.19.34.25 | COUNTRY=UK | AGE=21 |
…… | …… | …… |
可使用如下代码:
data.columns.foldLeft(data) {
(acc: DataFrame, colName: String) =>
acc.withColumn(colName, concat(lit(colName + "="), col(colName)))
}
利用foldLetf和lit函数