
添加新的一列
new_col_name 是新的一列的名字,F.lit(1)是全部都为 1 的一列,可以改成其他可以返回列的表达式
df = df.withColumn('new_col_name', F.lit(1))
输出dataframe的大小
print("df.shape :", df.count(), len(df.columns))
按行合并两个datafeame
两个df必须要有相同的columns
df_concat = df1.union(df2)
将一行展开为多行
假设有这样一张表
+------------+---+-----------+
| name|age| score|
+------------+---+-----------+
| jack| 10| 11,22,33,4|
|xiaochouchuo| 20| 12,3|
| dachouchou| 30| 212,555,52|
| yuyuyu| 40| 2,5|
+------------+---+-----------+
希望将它按score展开为
+------------+---+-----+
| name|age|score|
+------------+---+-----+
| jack| 10| 11|
| jack| 10| 22|
| jack| 10| 33|
| jack| 10| 4|
|xiaochouchuo| 20| 12|
|xiaochouchuo| 20| 3|
| dachouchou| 30| 212|
| dachouchou| 30| 555|
| dachouchou| 30| 52|
| yuyuyu| 40| 2|
| yuyuyu| 40| 5|
+------------+---+-----+
可以这样做
df.withColumn('score', F.explode(F.split(df.score, ','))).show()
这行代码的意思是,将score按照 ',' 分割,然后对分割后的数组每个元素都 explode 为一行
dataframe保存为hdfs parquet格式
df.coalesce(10).write.mode("overwrite").save(output_path, format='parquet')
coalesce(10) 分割成10份保存;mode("overwrite") 若已存在文件,则覆盖;format='parquet'
保存为parquet格式(该格式比较省空间)
pyspark读取csv|parquet|json文件
先创建会话
from pyspark.sql import session
session = session.SparkSession
.builder
.appName(self.app_name)
.enableHiveSupport()
.getOrCreate()
- 读取csv
session.read.csv(path)
- 读取parquet
session.read.parquet(path)
- 读取json
session.read.json(path)
- 读取text
session.read.text(path)
执行sql查询,并返回dataframe
from pyspark.sql import session
session = session.SparkSession
.builder
.appName(self.app_name)
.enableHiveSupport()
.getOrCreate()
df = session.sql(sql)
根据条件设置列的值
比如,将num列中,值小于100的设置为0,大于100保持不变
import pyspark.sql.functions as F
df = df.withColumn('col_name', F.when(df.num < 100, 0).otherwise(df.num))
求分位数|四分位数过滤异常值
df = df.withColumn('col_name', df['col_name'].cast(DoubleType()))
quantiles = df.approxQuantile('col_name', [0.25, 0.75], 0.05)
IQR = quantiles[1] - quantiles[0]
min_value = quantiles[0] - 1.5 * IQR
max_value = quantiles[1] + 1.5 * IQR
if min_value < 0:
min_value = 0
print "-" * 50 + "quantiles:", 'col_name', quantiles, "min_value,max_value", min_value, max_value
outlier_feature_dict['col_name'] = str(min_value) + '_' + str(max_value) + "_0_-911"
df = df.withColumn('col_name',
F.when(F.col('col_name') < min_value, min_value)
.otherwise(F.when(F.col('col_name') > max_value, max_value)
.otherwise(F.col('col_name'))))
使用自定义函数
def myfunc(val):
pass
df = df.withColumn('col_name', F.udf(myfunc, returnType=DoubleType())('col_name')