【发布时间】:2020-02-26 03:46:16
【问题描述】:
如果我有一个仅包含 IP 地址的宽数据帧(200m 列),并且我想删除包含空值或格式错误的 IP 地址的列,那么在 Spark 中执行此操作的最有效方法是什么?我的理解是 Spark 并行执行基于行的处理,而不是基于列的处理。因此,如果我尝试在列上应用转换,将会有很多改组。首先转置数据帧然后应用过滤器删除行,然后重新转置是利用 spark 并行性的好方法吗?
【问题讨论】:
-
200 M 列太多了。您最好的选择是对您的数据框进行采样(获取 10% 以便您的流程处理较少),然后同时在所有列上运行您的错误逻辑,删除坏列,循环通过迭代减少列数.如果你愿意,可以试试
val inputDF = spark.sql(select "'AAA' as col1, 'AAAA' as col2") ; val commandStatement = Array["sum(if(length(col1),1,0)) as col1_check", "sum(if(length(col2),1,0)) as col2_check"]; val outputDF = inputDF.selectExpr(commandStatement:_*); ###DO SOME CHECK LOGIC###这样的东西,我可以详细回答 -
通过执行布尔值后跟总和,您将获得每列的“坏”行总数。做一些百分位检查,如果它高于你的百分比失败标准,你可以删除该列。
标签: scala apache-spark apache-spark-sql