我想分割一个DataFrame
,关于一个布尔列。
我想出了:
def partition(df: DataFrame, c: Column): (DataFrame, DataFrame) =
(df.filter(c === true), df.filter(c === false))
注意:在我的用例中,c
是一个UDF。
有更好的方法吗?
I'd like:
- 避免扫描两次DataFrame
- 避免难看的布尔测试
下面是一个例子:
@ val df = sc.parallelize(Seq(1,2,3,4)).toDF("i")
df: org.apache.spark.sql.DataFrame = [i: int]
@ val u = udf((i: Int) => i % 2 == 0)
u: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>, BooleanType, List(IntegerType))
@ partition(df, u($"i"))
res25: (org.apache.spark.sql.DataFrame, org.apache.spark.sql.DataFrame) = ([i: int], [i: int])
使用combineByKey为布尔列
data.combineByKey(lambda value: (value, 1),
lambda x, value: (x[0] + value, x[1] + 1),
lambda x, y: (x[0] + y[0], x[1] + y[1]))