pyspark DataFrame问题解决

参考文档

1、https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.RDD.html

1、去除重复列

pyspark.sql.DataFrame.dropDuplicates(subset=None)

作用:返回删除重复行的新 DataFrame,可选择仅考虑某些列。

Examples

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)]).toDF()
df.dropDuplicates().show()
name age height
Alice 5 80
Alice 10 80
df.dropDuplicates(['name', 'height']).show()
name age height
Alice 5 80

2、按照一列排序

pyspark.sql.DataFrame.sort(*cols, **kwargs)

作用:返回按指定列排序的新 DataFrame。

cols: 指定排序的列。
kwargs:布尔值或布尔值列表(默认为 True)。 升序与降序排序。 指定多个排序顺序的列表。 如果指定了列表,则列表的长度必须等于列的长度。

Examples

df.sort(df.age.desc()).collect()
[Row(age=5, name='Bob'), Row(age=2, name='Alice')]

 df.sort("age", ascending=False).collect()
[Row(age=5, name='Bob'), Row(age=2, name='Alice')]

df.orderBy(df.age.desc()).collect()
[Row(age=5, name='Bob'), Row(age=2, name='Alice')]

from pyspark.sql.functions import *
df.sort(asc("age")).collect()
[Row(age=2, name='Alice'), Row(age=5, name='Bob')]

 df.orderBy(desc("age"), "name").collect()
[Row(age=5, name='Bob'), Row(age=2, name='Alice')]

df.orderBy(["age", "name"], ascending=[0, 1]).collect()
[Row(age=5, name='Bob'), Row(age=2, name='Alice')]

3、创建空DataFrame

有时候需要在迭代的过程中将多个dataframe进行合并(union),这时候需要一个空的初始dataframe。创建空dataframe可以通过spark.createDataFrame()方法来创建:

Examples

from pyspark.sql.types import StructType, StructField, StringType, IntegerType, DoubleType, LongType,ArrayType
fields = []
fields.append(StructField("promo_id", LongType(), True))
fields.append(StructField("promo_ext_second_type_cd", IntegerType(), True))
fields.append(StructField("need_amount", DoubleType(), True))
fields.append(StructField("return_amount", DoubleType(), True))
fields.append(StructField("need_num", IntegerType(), True))
fields.append(StructField("return_rate", DoubleType(), True))
fields.append(StructField("rebate", DoubleType(), True))
fields.append(StructField("end_time", StringType(), True))
fields.append(StructField("items", ArrayType(LongType()), True))
fields.append(StructField("freq", IntegerType(), True))
fields.append(StructField("group_num", LongType(), True))
schema = StructType(fields)
df1 = sparkSession.createDataFrame(sparkSession.sparkContext.emptyRDD(), schema)

参考:pyspark.sql.types数据类型汇总

4、扩展列

pyspark.sql.DataFrame.withColumn(colName, col)
通过添加列或替换具有相同名称的现有列来返回新的 DataFrame。列表达式必须是此 DataFrame 上的表达式; 尝试从其他 DataFrame 添加列将引发错误。

colName:添加的列名。

col:列或者列表达式。

注意:此方法在内部引入了投影。 因此,多次调用它,例如,通过循环以添加多个列可能会生成大计划,这可能会导致性能问题甚至 StackOverflowException。 为避免这种情况,请同时对多列使用 select()。

Examples

df.withColumn('age2', df.age + 2).collect()
[Row(age=2, name='Alice', age2=4), Row(age=5, name='Bob', age2=7)]

df.select(df.name, (df.age + 10).alias('age')).collect()
[Row(name='Alice', age=12), Row(name='Bob', age=15)]

5、扩展行

DataFrame.union(other)[source]

返回一个新的 DataFrame,其中包含此 DataFrame 和另一个 DataFrame 中的行的联合。

这相当于 SQL 中的 UNION ALL。 要执行 SQL 样式的集合并集(对元素进行重复数据删除),请使用此函数后跟 distinct()。

同样作为 SQL 中的标准,此函数按位置(而不是名称)解析列。

5、转换为列表

pyspark.RDD.collect

返回一个包含rdd所有元素的list

你可能感兴趣的:(Spark,spark,big,data,数据挖掘,1024程序员节)