我正在尝试以最有效的方式拆分DataFrame(约200M行(。这里有一个测试样本来解释:
df.show()
+----+------+--------+
| id | size | weight |
+----+------+--------+
| 1 | 10 | 200 |
| 2 | 50 | 100 |
| 3 | 75 | 300 |
+----+------+--------+
我正试图根据过滤器将这个数据帧拆分为两个集,比如一个有效的错误文件(或者至少直接保存到我的hdfs中作为镶木地板文件(,例如大小>50&重量>300,这样我就可以在那个过滤器上拆分我的数据帧。
我的第一直觉是根据不同的过滤器创建一个布尔列(0,1(,然后将这些新列相加,最终应用过滤器>0和==0来创建我的2个集合。
这是一种有效的方法吗?还是你认为有更好的解决方案?
是的,你提出的想法听起来不错。接下来,一旦您定义了df
,我建议您使用如下代码:
import org.apache.spark.sql.functions as F
df2 = df.withColumn("Check_Column", F.when((F.col("size") > 50) && (F.col("weight") > 300),F.lag(1)).otherwise(0))
df2.show()
上面将添加一个新列,其中包含与您的条件是否满足相对应的布尔条目。然后,我会过滤掉这些结果,以创建您想要的两个数据集:
df_True = df2.filter(df2.Check_Column == 1)
df_True.show()
df_False = df2.filter(df2.Check_Column == 0)
df_False.show()