这是输入spark dataframe。基于"代码类型",我需要将此数据框架分为子数据框架,如下
val dsTotal = fr.toDF("Key","Code")
dsTotal.show()
--------------
|key | Code |
--------------
|200 | DS |
|300 | CP |
|400 | DS |
|76 | OR |
|45 | CP |
|34 | DS |
|33 | OR |
|200 | DS |
--------------
我已经在相同的超级数据框架上重复使用过滤器选项来创建子数据框架。还有其他更好的方法来生成子数据框架
val ds1 = dsTotal.filter(col("Code").equalTo("CP"))
ds1.show()
--------------
|key | Code |
--------------
|45 | CP |
|300 | CP |
--------------
val ds2 = dsTotal.filter(col("Code").equalTo("DS"))
ds2.show()
--------------
|key | Code |
--------------
|200 | DS |
|400 | DS |
|200 | DS |
|34 | DS |
--------------
val ds3 = dsTotal.filter(col("Code").equalTo("OR"))
ds3.show()
--------------
|key | Code |
--------------
|76 | OR |
|33 | OR |
--------------
filter
和 select
是我看到的split
dataframe
到 subdataframe
s的最佳方法之一。
因此,您拥有最好的方法之一,但是您的filter
具有Code
的静态检查,可以通过执行以下操作来避免。
第一步是获取Code
列的distinct
值
import org.apache.spark.sql.functions._
val array = df.select(collect_list("Code")).first()(0).asInstanceOf[mutable.WrappedArray[String]].distinct
应该给你
WrappedArray(DS, CP, OR)
下一步将是循环循环distinct
值并将subdataframe
S存储在hashmap
val splittedDFs : mutable.HashMap[String, DataFrame] = mutable.HashMap.empty[String, DataFrame]
for(key <- array){
splittedDFs ++= mutable.HashMap(key -> df.filter($"Code" === key))
}
现在您可以访问sub-dataframe
splittedDFs("CP").show(false)
应该是
+---+----+
|key|Code|
+---+----+
|300|CP |
|45 |CP |
+---+----+
您也可以使用select
而不是filter
。
我希望答案有帮助