2016-06-29 6 views
9

Мне было интересно, можно ли изменить положение столбца в фреймворке данных, на самом деле изменить схему?Как изменить положение столбца в искровом фрейме?

Точно, если у меня есть dataframe, как [field1, field2, field3], и я хотел бы получить [field1, field3, field2].

Любая помощь была бы высоко оценена!

Спасибо.

Редактировать: Я не могу поместить какой-либо фрагмент кода. Представим себе, что мы работаем с файловой рамкой со сто столбцов, после некоторых объединений и trnsformations некоторые из этих столбцов неуместны относительно схемы таблицы назначения. Итак, я хочу сказать: как перемещать один или несколько столбцов, т. Е. Как изменить схему?

Спасибо.

+0

Просьба указать код, показывающий, какие усилия вы предприняли до сих пор. http://stackoverflow.com/help/how-to-ask –

+0

Dataframes неизменны, поэтому все, что вы делаете, все равно будет возвращать новый. В большинстве случаев я бы подумал, что вы могли бы избежать этого. – Jeff

+1

Не могли бы вы уточнить, что именно вы ожидаете отсюда? Это довольно расплывчато в этот момент. – zero323

ответ

22

Вы можете получить имена столбцов, изменить порядок их, как вы хотите, а затем использовать select на оригинал DataFrame, чтобы получить новый с этим новым порядком:

val columns: Array[String] = dataFrame.columns 
val reorderedColumnNames: Array[String] = ??? // do the reordering you want 
val result: DataFrame = dataFrame.select(reorderedColumnNames.head, reorderedColumnNames.tail: _*) 
+0

Спасибо всем за ответы, все работает! Тем не менее, я остаюсь озадаченным работой с именем столбцов, а не схемой. Приветствия. –

+0

Это действительно помогает! Хорошее решение. Цените !!! – anand

2

Как и другие комментаторы, мне интересно узнать, почему вы это сделаете, поскольку заказ не имеет значения, когда вы можете запрашивать столбцы по их именам.

Во всяком случае, с помощью выбора должны дать ощущение столбцов переместился в описании схемы:

val data = Seq(
    ("a",  "hello", 1), 
    ("b",  "spark", 2) 
) 
.toDF("field1", "field2", "field3") 

data 
.show() 

data 
.select("field3", "field2", "field1") 
.show() 
+2

Возможно, я ошибаюсь, но при использовании метода .write для добавления раздела в таблицу hive он, похоже, записывается положением, а не по имени. Я был бы очень счастлив в этом случае :) –

+0

Когда вы используете SparkContext.union, союз на основе RDD будет игнорировать схему, поэтому в этом случае порядок столбцов должен быть переопределен. –

+0

Союзы. Вопросы заказа, даже если столбцы все одинаковы. У меня был класс case, установленный как схема на двух наборах данных, но с разными порядками столбцов. Пришлось настроить порядок, чтобы профсоюз работал. –

2

крошечная другая версии сравнить с @Tzach Зоара

val cols = df.columns.map(df(_)).reverse 
val reversedColDF = df.select(cols:_*) 
1

spark-daria библиотека имеет reorderColumns метод, который позволяет легко изменить порядок столбцов в DataFrame.

import com.github.mrpowers.spark.daria.sql.DataFrameExt._ 

val actualDF = sourceDF.reorderColumns(
    Seq("field1", "field3", "field2") 
) 

Метод reorderColumns использует решение @Rockie Янга под капотом.

Если вы хотите, чтобы получить заказ столбца df1 равной упорядоченность столбца df2, что-то, как это должно работать лучше, чем жестко прописывать все столбцы:

df1.reorderColumns(df2.columns) 

spark-daria библиотека также определяет sortColumns преобразования в сортировать столбцы в порядке возрастания или убывания (если вы не хотите указывать весь столбец в последовательности).

import com.github.mrpowers.spark.daria.sql.transformations._ 

df.transform(sortColumns("asc")) 
Смежные вопросы