如何根据 Spark-scala 中的过滤器将数据集分为两部分

use*_*589 3 scala apache-spark

是否可以使用单个过滤器操作将 DF 分为两部分。例如

假设 df 有以下记录

UID    Col
 1       a
 2       b
 3       c
Run Code Online (Sandbox Code Playgroud)

如果我做

df1 = df.filter(UID <=> 2)
Run Code Online (Sandbox Code Playgroud)

我可以在单个操作中将过滤和未过滤的记录保存在不同的 RDD 中吗?

 df1 can have records where uid = 2
 df2 can have records with uid 1 and 3 
Run Code Online (Sandbox Code Playgroud)

zer*_*323 6

如果您只对保存数据感兴趣,您可以将指标列添加到DataFrame

val df = Seq((1, "a"), (2, "b"), (3, "c")).toDF("uid", "col")
val dfWithInd = df.withColumn("ind", $"uid" <=> 2)
Run Code Online (Sandbox Code Playgroud)

并将其用作具有DataFrameWriter支持格式之一的分区列(对于 1.6,它是 Parquet、文本和 JSON):

dfWithInd.write.partitionBy("ind").parquet(...)
Run Code Online (Sandbox Code Playgroud)

它将在写入时创建两个单独的目录 ( ind=false, ind=true)。

但一般来说,不可能产生多个RDDsDataFrames从单个转换。请参阅如何将 RDD 拆分为两个或多个 RDD?