如何 select 所有以公共标签开头的列
how to select all columns that starts with a common label
我在 Spark 1.6 中有一个数据框,我想 select 从中提取一些列。列名如下:
colA, colB, colC, colD, colE, colF-0, colF-1, colF-2
我知道我可以对 select 特定列执行此操作:
df.select("colA", "colB", "colE")
但是如何 select、"colA"、"colB" 以及所有的 colF-* 列?有没有像 中那样的方法?
首先获取带有 df.columns
的列名,然后筛选出您想要的列名 .filter(_.startsWith("colF"))
。这为您提供了一个字符串数组。但是 select 需要 select(String, String*)
。幸运的是,列的 select 是 select(Column*)
,所以最终将字符串转换为 .map(df(_))
的列,最后将列数组转换为 : _*
.[=19 的 var arg =]
df.select(df.columns.filter(_.startsWith("colF")).map(df(_)) : _*).show
此过滤器可以做得更复杂(与 Pandas 相同)。然而,这是一个相当丑陋的解决方案(IMO):
df.select(df.columns.filter(x => (x.equals("colA") || x.startsWith("colF"))).map(df(_)) : _*).show
如果其他列的列表是固定的,您还可以将固定的列名数组与过滤后的数组合并。
df.select((Array("colA", "colB") ++ df.columns.filter(_.startsWith("colF"))).map(df(_)) : _*).show
我写了一个函数来做到这一点。阅读评论以了解其工作原理。
/**
* Given a sequence of prefixes, select suitable columns from [[DataFrame]]
* @param columnPrefixes Sequence of prefixes
* @param dF Incoming [[DataFrame]]
* @return [[DataFrame]] with prefixed columns selected
*/
def selectPrefixedColumns(columnPrefixes: Seq[String], dF: DataFrame): DataFrame = {
// Find out if given column name matches any of the provided prefixes
def colNameStartsWith: String => Boolean = (colName: String) =>
columnsPrefix.map(prefix => colName.startsWith(prefix)).reduce(_ || _)
// Filter columns list by checking against given prefixes sequence
val columns = dF.columns.filter(colNameStartsWith)
// Select filtered columns list
dF.select(columns.head, columns.tail:_*)
}
Python(在 Azure Databricks 中测试)
selected_columns = [column for column in df.columns if column.startswith("colF")]
df2 = df.select(selected_columns)
在 PySpark 中,使用:colRegex 到 select 以 colF 开头的列
白色样品:
colA, colB, colC, colD, colE, colF-0, colF-1, colF-2
申请:
df.select(col("colA"), col("colB"), df.colRegex("`(colF)+?.+`")).show()
结果是:
colA, colB, colF-0, colF-1, colF-2
我在 Spark 1.6 中有一个数据框,我想 select 从中提取一些列。列名如下:
colA, colB, colC, colD, colE, colF-0, colF-1, colF-2
我知道我可以对 select 特定列执行此操作:
df.select("colA", "colB", "colE")
但是如何 select、"colA"、"colB" 以及所有的 colF-* 列?有没有像
首先获取带有 df.columns
的列名,然后筛选出您想要的列名 .filter(_.startsWith("colF"))
。这为您提供了一个字符串数组。但是 select 需要 select(String, String*)
。幸运的是,列的 select 是 select(Column*)
,所以最终将字符串转换为 .map(df(_))
的列,最后将列数组转换为 : _*
.[=19 的 var arg =]
df.select(df.columns.filter(_.startsWith("colF")).map(df(_)) : _*).show
此过滤器可以做得更复杂(与 Pandas 相同)。然而,这是一个相当丑陋的解决方案(IMO):
df.select(df.columns.filter(x => (x.equals("colA") || x.startsWith("colF"))).map(df(_)) : _*).show
如果其他列的列表是固定的,您还可以将固定的列名数组与过滤后的数组合并。
df.select((Array("colA", "colB") ++ df.columns.filter(_.startsWith("colF"))).map(df(_)) : _*).show
我写了一个函数来做到这一点。阅读评论以了解其工作原理。
/**
* Given a sequence of prefixes, select suitable columns from [[DataFrame]]
* @param columnPrefixes Sequence of prefixes
* @param dF Incoming [[DataFrame]]
* @return [[DataFrame]] with prefixed columns selected
*/
def selectPrefixedColumns(columnPrefixes: Seq[String], dF: DataFrame): DataFrame = {
// Find out if given column name matches any of the provided prefixes
def colNameStartsWith: String => Boolean = (colName: String) =>
columnsPrefix.map(prefix => colName.startsWith(prefix)).reduce(_ || _)
// Filter columns list by checking against given prefixes sequence
val columns = dF.columns.filter(colNameStartsWith)
// Select filtered columns list
dF.select(columns.head, columns.tail:_*)
}
Python(在 Azure Databricks 中测试)
selected_columns = [column for column in df.columns if column.startswith("colF")]
df2 = df.select(selected_columns)
在 PySpark 中,使用:colRegex 到 select 以 colF 开头的列 白色样品:
colA, colB, colC, colD, colE, colF-0, colF-1, colF-2
申请:
df.select(col("colA"), col("colB"), df.colRegex("`(colF)+?.+`")).show()
结果是:
colA, colB, colF-0, colF-1, colF-2