如何选择以通用标签开头的所有列



我在Spark 1.6中有一个数据帧,只想从中选择一些列。列名称如下所示:

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

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

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

但是如何一次选择,说"colA"、"colB"和所有 colF-* 列?有没有像熊猫一样的方法?

该过程可以分解为以下步骤:

  1. 首先用df.columns抓取列名,
  2. 然后向下筛选到要.filter(_.startsWith("colF"))的列名。这为您提供了一个字符串数组。
  3. 但是选择需要select(String, String*).幸运的是,选择列是select(Column*),所以最后将字符串转换为带有.map(df(_))的列,
  4. 最后将列数组转换为带有 : _* 的 var arg .

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

这个过滤器可以做得更复杂(与熊猫一样)。然而,这是一个相当丑陋的解决方案(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

Python (在 Azure Databricks 中测试)

selected_columns = [column for column in df.columns if column.startswith("colF")]
df2 = df.select(selected_columns)

在 PySpark 中,使用: colRegex 选择以 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

我写了一个函数来做到这一点。阅读评论以了解其工作原理。

  /**
    * 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:_*)
  }

相关内容

  • 没有找到相关文章

最新更新