关于scala:如何选择以通用标签开头的所有列

how to select all columns that starts with a common label

我在Spark1.6中有一个数据框架,想要从中选择一些列。列名如下:

1
colA, colB, colC, colD, colE, colF-0, colF-1, colF-2

我知道我可以这样做来选择特定的列:

1
df.select("colA","colB","colE")

但是如何同时选择"cola"、"colb"和所有colf-*列呢?熊猫有什么办法吗?


首先用df.columns抓取列名,然后过滤到只需要.filter(_.startsWith("colF"))的列名。这将为您提供一个字符串数组。但选择采用select(String, String*)。幸运的是,select for columns是select(Column*),所以最后用.map(df(_))将字符串转换成列,最后用: _*将列数组转换成var arg。

1
df.select(df.columns.filter(_.startsWith("colF")).map(df(_)) : _*).show

这个过滤器可以变得更复杂(和熊猫一样)。然而,这是一个相当丑陋的解决方案(IMO):

1
df.select(df.columns.filter(x => (x.equals("colA") || x.startsWith("colF"))).map(df(_)) : _*).show

如果其他列的列表是固定的,则还可以将列名称的固定数组与筛选数组合并。

1
df.select((Array("colA","colB") ++ df.columns.filter(_.startsWith("colF"))).map(df(_)) : _*).show