Как получить имя столбца фрейма данных в pyspark?

В пандах это можно сделать с помощью column.name.

Но как сделать то же самое, когда его столбец искры фреймворка?

например Вызывающая программа имеет фрейм данных Spark: spark_df

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

Эта программа вызывает мою функцию: my_function (spark_df ['rank']) В my_function мне нужно имя столбца, то есть 'rank'

Если это был фреймворк pandas, мы можем использовать внутри my_function

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

person Kaushik Acharya    schedule 28.09.2016    source источник


Ответы (5)


Вы можете получить имена из схемы, выполнив

spark_df.schema.names

Распечатка схемы также может быть полезна для ее визуализации.

spark_df.printSchema()
person David    schedule 28.09.2016
comment
Я хотел знать имя столбца, который является входным параметром моей функции. Вызывающая программа вызовет my_function с помощью my_function (spark_df ['rank']) Внутри my_function, как мне узнать имя переданного столбца? - person Kaushik Acharya; 29.09.2016
comment
Вы можете использовать pyspark.sql.functions.col для доступа к столбцу по имени. Например, df.filter( col(var_name) > 1) - person shuaiyuancn; 29.09.2016
comment
@ShuaiYuan, я не этого хочу. Как мне узнать имя столбца внутри my_function (col)? Вызов функций с помощью my_function (spark_df ['rank']) Внутри my_function я хочу извлечь 'rank' в качестве имени столбца из входного параметра: col - person Kaushik Acharya; 30.09.2016
comment
Это кажется странной просьбой. Но вы можете изменить свою функцию, чтобы взять строку для имени столбца - person David; 30.09.2016
comment
Вы можете изменить свои функции на myfunc(df, name), тогда у вас будет доступ к name в вашей функции. Если вам нужно использовать этот столбец в фрейме данных, выполните df[name] - person shuaiyuancn; 30.09.2016
comment
Или вы можете использовать _1 _ - person shuaiyuancn; 30.09.2016
comment
В моем случае я проверил имя столбца if 'col_name' in df.schema.names: # do something. Спасибо за ответ. - person Pablo Adames; 12.09.2020

Единственный способ - перейти на базовый уровень JVM.

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

Таким же образом он преобразуется в str в самом коде pyspark.

Из pyspark / sql / column.py:

def __repr__(self):
    return 'Column<%s>' % self._jc.toString().encode('utf8')
person numeral    schedule 31.03.2017
comment
К сожалению, это не приведет к извлечению псевдонима, если он есть. - person santon; 06.02.2018
comment
Правда. но вы можете легко разобрать это, если есть псевдоним. _1 _ (\ S *) _ 2_ - ›'some_alias'. Конечно, это не идеально, поскольку мы выполняем некоторый синтаксический анализ регулярных выражений, но я надеюсь, что вряд ли у вас есть какое-то имя столбца с именем AS bad. - person numeral; 08.02.2018
comment
@numeral предоставляет ли базовый код JVM какую-либо логику синтаксического анализатора, которую можно использовать вместо того, чтобы накатывать ее вручную? - person shadowtalker; 07.01.2019
comment
@shadowtalker После проверки spark.apache.org/docs/2.2.0/api/java/index.html?org/apache/ - person numeral; 08.01.2019
comment
Псевдоним также можно извлечь без использования регулярного выражения: str (column) .split ('AS') [1] .split ('' ') [1] - person Cesare Iurlaro; 29.11.2020

Если вам нужны имена столбцов вашего фрейма данных, вы можете использовать класс 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'

person Pat    schedule 13.05.2017
comment
Продолжая идею: [x[0] for x in df.dtypes] - person David C.; 12.06.2020

Python

Как правильно сказал @numeral, column._jc.toString() отлично работает в случае столбцов без элайсинга.

В случае столбцов с псевдонимами (т.е. column.alias("whatever")) псевдоним можно извлечь даже без использования регулярных выражений: str(column).split(" AS ")[1].split("`")[1].

Я не знаю синтаксиса Scala, но уверен, что с ним можно сделать то же самое.

person Cesare Iurlaro    schedule 29.11.2020

Я нашел ответ очень-очень простым ...

// 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.

person Yucci Mel    schedule 20.03.2019
comment
в python это будет col._jc.toString () - person justin cress; 01.08.2019