【发布时间】:2020-11-30 17:12:04
【问题描述】:
假设您在 spark(字符串类型)中有一个数据框,并且您想要删除任何包含“foo”的列。在下面的示例数据框中,您将删除列“c2”和“c3”,但保留“c1”。但是,我希望该解决方案能够推广到大量的列和行。
+-------------------+
| c1| c2| c3|
+-------------------+
| this| foo| hello|
| that| bar| world|
|other| baz| foobar|
+-------------------+
我的解决方案是扫描数据框中的每一列,然后使用数据框 API 和内置函数聚合结果。 因此,可以像这样扫描每一列(我是 scala 新手,请原谅语法错误):
df = df.select(df.columns.map(c => col(c).like("foo"))
从逻辑上讲,我会有一个像这样的中间数据框:
+--------------------+
| c1| c2| c3|
+--------------------+
| false| true| false|
| false| false| false|
| false| false| true|
+--------------------+
然后将其聚合成一行以读取需要删除的列。
exprs = df.columns.map( c => max(c).alias(c))
drop = df.agg(exprs.head, exprs.tail: _*)
+--------------------+
| c1| c2| c3|
+--------------------+
| false| true| true|
+--------------------+
现在可以删除任何包含 true 的列。
我的问题是:有没有更好的方法来做到这一点,性能明智?在这种情况下,一旦找到“foo”,spark 是否会停止扫描列?数据的存储方式是否重要(镶木地板有帮助吗?)。
谢谢,我是新来的,所以请告诉我如何改进这个问题。
【问题讨论】:
-
除了不实际工作,我不知道你怎么能把它短路。有兴趣看看对方怎么说。
标签: scala apache-spark apache-spark-sql