2015-10-08 4 views
7

Есть ли лучший способ префикса или переименовать все или несколько столбцов одновременно с данным SparkSQL DataFrame, чем вызов нескольких раз dataFrame.withColumnRenamed()?Spark DataFrame и переименование нескольких столбцов (Java)

Примером может быть, если я хочу обнаружить изменения (используя полное внешнее соединение). Затем я остаюсь с двумя DataFrame с той же структурой.

ответ

6

Предлагаю использовать метод select() для этого. На самом деле методColumnRenamed() использует select() сам по себе. Вот пример того, как переименовать несколько столбцов:

import org.apache.spark.sql.functions._ 

val someDataframe: DataFrame = ... 

val initialColumnNames = Seq("a", "b", "c") 
val renamedColumns = initialColumnNames.map(name => col(name).as(s"renamed_$name")) 
someDataframe.select(renamedColumns : _*) 
+0

Это больше о Java API и Спарк. В качестве примера 'select' ожидает либо один параметр String, либо varargs или массив' Column ', который не является согласованным, а также иногда немного раздражает. Мне пришлось создать несколько вспомогательных методов для решения этой проблемы, но было бы лучше, если бы эти методы были доступны непосредственно в 'DataFrame'. – JiriS

+0

Существует еще один пример [здесь] (http://stackoverflow.com/questions/32535273/how-to-match-dataframe-column-names-to-scala-case-class-attributes) –

+0

Пробовал ли вы код с помощью Spark 2.0? Я имею дело с 7000 столбцами, см. Https://github.com/ramhiser/datamicroarray/wiki/Golub-(1999). Это требуется навсегда (= никогда не закончилось, пока мое терпение не закончилось). – Boern

0

Я heve только что нашел ответ

df1_r = df1.select(*(col(x).alias(x + '_df1') for x in df1.columns)) 

на stackoverflow here (см конец принятого ответа)

-1

Хотя это не отвечает на вопрос, но я всегда обновляю имена столбцов один за другим. Поскольку он обновляет только метаданные DF, нет никакого вреда (не влияет на производительность) по обновлению имен столбцов один за другим, например .:

for c in DF.columns: 
    new_c = c.strip().replace(' ','_') 
    DF = DF.withColumnRenamed(c, new_c) 
+0

Нет вреда? Вы попробовали это для сотен столбцов? Я сделал, и работа закончилась с ошибкой stackoverflow через три часа. Принятый ответ вместо этого переименовал сотни столбцов мгновенно. –

+0

Да, я это испытал. Какая версия искры? Я использовал это на столе с 700 + столбцами. В Spark 1.5/CDH 5.5. Опять же, DF.withColumnRenamed просто обновляет метаданные DF, так что это очень быстро. Вы уверены, что это та часть, которая дает вам startoverflow? Возможно, это ошибка Spark, к которой вы клоните. Пожалуйста, введите полный код. Я уверен, что код работает, я использовал его на наших производственных заданиях. – Tagar

+0

Я использовал 'Spark 1.6.2' и Scala вместо Java. Являются ли DataFrames изменчивыми в Java и не создают новый экземпляр с каждой итерацией? Если это так, это объяснит, почему это работает для вас. –

0
or (a <- 0 to newsales.columns.length - 1) 
{ 
var new_c = newsales.columns(a).replace('(','_').replace(')',' ').trim 
newsales_var = newsales.withColumnRenamed(newsales.columns(a),new_c) 
} 
+0

Пожалуйста, отредактируйте с дополнительной информацией. Только код и «попробуйте» ответы не приветствуются, поскольку они не содержат содержимого, доступного для поиска, и не объясняют, почему кто-то должен «попробовать это». Мы прилагаем усилия, чтобы стать источником знаний. – abarisone

Смежные вопросы