scala - 只需过滤一次即可有效地将 Spark DataFrame 一分为二
问题描述
比方说,我们有dfSource
非平凡的 Dataframe(例如,不同连接的结果等)和大尺寸(例如 100k+ 行),并且它有一个 column some_boolean
,我想用它来拆分,如下所示:
val dfTrue = dfSource.where(col("some_boolean") === true)
// write dfTrue, e.g. dfTrue.write.parquet("data1")
val dfFalse = dfSource.where(col("some_boolean") === false)
// write dfFalse, e.g. dfFalse.write.parquet("data2")
现在这将导致两次扫描和过滤数据,对吧?有没有办法更有效地做到这一点?我想到了类似的东西
val (dfTrue, dfFalse) = dfSource.split(col("some_boolean") === true)
// write dfTrue and dfFalse
解决方案
我看到您在拆分后存储输出。写的时候可以使用partitionPy
如下:
dfSource = spark.createDataFrame([
['a', True],
['b', False],
['c', True],
['d', True],
['e', False],
['f', False]
], ["col1", "col2"]).cache()
dfSource.show()
+----+-----+
|col1| col2|
+----+-----+
| a| true|
| b|false|
| c| true|
| d| true|
| e|false|
| f|false|
+----+-----+
dfSource.write.partitionBy("col2").parquet("/tmp/df")
您将看到这两个目录/tmp/df/col2=true
和/tmp/df/col2=false
现在你可以像往常一样阅读它们了
dfTrue = spark.read.parquet("/tmp/df/col2=true")
dfTrue.show()
+----+
|col1|
+----+
| a|
| c|
| d|
+----+
dfFalse = spark.read.parquet("/tmp/df/col2=false")
dfFalse.show()
+----+
|col1|
+----+
| b|
| e|
| f|
+----+
推荐阅读
- performance - x86 Windows/Linux 应用程序在最小化页数方面是否有性能提升?
- c# - 有没有混淆 .cmd 文件的方法?
- statistics - 什么统计测试使用 statsmodel 来计算显着性?
- javascript - 复合组件:如何在反应中引用点击的子元素?
- vue.js - VueJS 路由器 $routes.push 无法推送查询参数
- android - 如何通过主页按钮创建活动
- android - 当我单击按钮加载数据时出现运行时异常
- git - 在 git 中合并两个冲突的分支时,如何明确提及要应用哪些分支更改?
- excel - 在excel中将“,00 text”更改为“,00 | text”
- led - 如果条件后如何关闭 LED 灯条