如何在pyspark中获取dataframe列的名称?

如何在pyspark中获取dataframe列的名称?,pyspark,pyspark-sql,Pyspark,Pyspark Sql,在pandas中,这可以通过column.name完成 但是当它的spark数据帧列出现时,如何做同样的事情呢 e、 g.调用程序有一个spark数据帧:spark_df >>> spark_df.columns ['admit', 'gre', 'gpa', 'rank'] 这个程序调用my function:my_function(spark_df['rank']) 在我的函数中,我需要列的名称,即“rank” 如果是pandas dataframe,我们可以在my_函数

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

但是当它的spark数据帧列出现时,如何做同样的事情呢

e、 g.调用程序有一个spark数据帧:spark_df

>>> spark_df.columns
['admit', 'gre', 'gpa', 'rank']
这个程序调用my function:my_function(spark_df['rank']) 在我的函数中,我需要列的名称,即“rank”

如果是pandas dataframe,我们可以在my_函数中使用

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

您可以通过执行以下操作从模式中获取名称

spark_df.schema.names
打印模式也有助于将其可视化

spark_df.printSchema()

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

df.col._jc.toString().encode('utf8')
这也是如何在pyspark代码本身中将其转换为
str

从pyspark/sql/column.py:

def __repr__(self):
    return 'Column<%s>' % self._jc.toString().encode('utf8')
def\uuu repr\uu(自):
返回“列'%self.\u jc.toString().encode('utf8')”

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

>测向列['High']
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:列表索引必须是整数,而不是str

但是,在dataframe上调用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'

我发现答案非常简单

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

变量“thenameofcol”是“colName”

Python

正如@numeric正确地说的,
列。_jc.toString()
在未关联列的情况下可以正常工作

对于带别名的列(即
column.alias(“任意”)
),即使不使用正则表达式,也可以提取别名:
str(column.split(“AS”)[1]。split(“`”)[1]


我不知道Scala的语法,但我相信也可以这样做。

我想知道的是作为函数输入参数的列的名称。调用程序将通过my_函数(spark_df['rank'])调用my_函数。my_函数中的my_函数如何知道传递的列的名称?您可以使用
pyspark.sql.functions.col
按名称访问列。例如,
df.filter(col(var_name)>1)
@ShuaiYuan,这不是我想要的。在我的_函数(col)中,我如何知道col名称?通过my_函数调用函数(spark_df['rank'])在my_函数中,我想从输入参数中提取'rank'作为列名:col您可以将函数更改为
myfunc(df,name)
,然后您就可以在函数中访问
name
。当您需要在数据帧中使用该列时,请执行
df[name]
或者,如果存在别名,您可以使用该列。很遗憾,如果存在别名,则不会拉出别名。True。但是如果有别名,你可以很容易地解析出来<代码>重新搜索('AS(\S*)
,col.alias('some\u alias')。\u jc.toString())。组(1)
->
'some\u alias'
。当然这并不完美,因为我们正在进行一些正则表达式解析,但我希望您不太可能有一个名为“AS
bad
”的列名在它里面。@numeric底层JVM代码是否公开了任何类型的解析器逻辑,可以用来代替手工滚动?@shadowtalker检查别名后,它似乎不是这样的,也可以不使用任何正则表达式来提取别名:str(column).split('AS')[1]。split('`')[1]在python中是col.\u jc.toString(),意思是:
[x[0]对于df.d类型中的x]