【问题标题】:How to get name of dataframe column in pyspark?如何在pyspark中获取数据框列的名称?
【发布时间】:2017-02-06 09:20:43
【问题描述】:

在 pandas 中,这可以通过 column.name 来完成。

但是当它的 spark dataframe 列时如何做呢?

例如调用程序有一个 spark 数据框:spark_df

>>> spark_df.columns
['admit', 'gre', 'gpa', 'rank']

这个程序调用我的函数:my_function(spark_df['rank']) 在 my_function 中,我需要列的名称,即“rank”

如果是pandas dataframe,我们可以在my_function里面使用

>>> pandas_df['rank'].name
'rank'

【问题讨论】:

    标签: pyspark pyspark-sql


    【解决方案1】:

    您可以通过以下方式从架构中获取名称

    spark_df.schema.names
    

    打印模式也有助于将其可视化

    spark_df.printSchema()
    

    【讨论】:

    • 我想知道的是列的名称,它是我的函数的输入参数。调用程序将通过 my_function(spark_df['rank']) 调用 my_function 在 my_function 中我如何知道传递的列的名称?
    • 您可以使用pyspark.sql.functions.col 按名称访问列。例如,df.filter( col(var_name) > 1)
    • @ShuaiYuan,这不是我想要的。在 my_function(col) 里面我怎么知道 col 名称?通过 my_function(spark_df['rank']) 调用函数在 my_function 中,我想从输入参数中提取 'rank' 作为列名:col
    • 您可以将您的功能更改为myfunc(df, name),然后您可以在您的功能中访问name。当您需要在数据框中使用该列时,请执行 df[name]
    • 或者,你可以使用Dataframe.Column.__repr__
    【解决方案2】:

    唯一的方法是进入 JVM 的底层。

    df.col._jc.toString().encode('utf8')
    

    这也是它在 pyspark 代码本身中转换为 str 的方式。

    来自 pyspark/sql/column.py:

    def __repr__(self):
        return 'Column<%s>' % self._jc.toString().encode('utf8')
    

    【讨论】:

    • 如果有别名,这不会拉出别名,不幸的是。
    • 是的。但如果有别名,您可以轻松解析出来。 re.search('AS (\S*)', col.alias('some_alias')._jc.toString()).group(1) -> 'some_alias'。当然这并不完美,因为我们正在做一些正则表达式解析,但我希望你不太可能有一些名为“AS bad”的列名。
    • @numeral 底层 JVM 代码是否公开了任何类型的解析器逻辑,可以用来代替手动滚动它?
    • 不使用任何正则表达式也可以提取别名:str(column).split('AS')[1].split('`')[1]
    【解决方案3】:

    如果您想要数据框的列名,可以使用pyspark.sql 类。我不确定 SDK 是否支持按列名显式索引 DF。我收到了这个回溯:

    >>> df.columns['High'] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: list indices must be integers, not str

    但是,在您的数据框上调用 columns 方法(您已完成)将返回列名列表:

    df.columns 将返回 ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']

    如果需要列数据类型,可以调用dtypes方法:

    df.dtypes 将返回 [('Date', 'timestamp'), ('Open', 'double'), ('High', 'double'), ('Low', 'double'), ('Close', 'double'), ('Volume', 'int'), ('Adj Close', 'double')]

    如果你想要一个特定的列,你需要通过索引来访问它:

    df.columns[2] 将返回 'High'

    【讨论】:

    • 继续这个想法:[x[0] for x in df.dtypes]
    【解决方案4】:

    Python

    正如@numeral 正确所说,column._jc.toString() 在无别名列的情况下工作正常。

    如果是别名列(即column.alias("whatever")),即使不使用正则表达式,也可以提取别名:str(column).split(" AS ")[1].split("`")[1]

    我不知道 Scala 语法,但我确信它可以做到这一点。

    【讨论】:

      【解决方案5】:

      我发现答案很简单...

      // It is in java, but it should be same in pyspark
      Column col = ds.col("colName"); //the column object
      String theNameOftheCol = col.toString();
      

      变量“theNameOftheCol”是“colName”

      【讨论】:

      • 在 python 中是 col._jc.toString()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 2023-02-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 2021-09-14
      相关资源
      最近更新 更多