Spark从超级数据框中优化方法生成子数据框架



这是输入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   |
--------------

filterselect是我看到的split dataframesubdataframe 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

我希望答案有帮助

相关内容

  • 没有找到相关文章

最新更新