2015-10-08 11 views
7

Czy istnieje lepszy sposób na prefiks lub zmianę nazwy wszystkich lub wielu kolumn w tym samym czasie danego SparkSQL DataFrame niż wywołanie wiele razy dataFrame.withColumnRenamed()?Spark DataFrame i zmiana nazwy wielu kolumn (Java)

Przykładem może być, jeśli chcę wykryć zmiany (używając pełnego sprzężenia zewnętrznego). Zostałem mi z dwoma DataFrame s o tej samej strukturze.

Odpowiedz

6

Proponuję użyć metody select(), aby to wykonać. W rzeczywistości metodaColumnRenamed() sama używa metody select(). Oto przykład, jak nazwy wielu kolumn:

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

To więcej o Java API i Spark. Jako przykład 'select' oczekuje albo jednego parametru String, a następnie varargs lub tablicy' Column's, która nie jest spójna, a także czasami nieco denerwująca w użyciu. Musiałem stworzyć kilka metod pomocniczych, aby poradzić sobie z tym problemem, ale lepiej byłoby, gdyby te metody były bezpośrednio dostępne w 'DataFrame'. – JiriS

+0

Istnieje inny przykład [tutaj] (http://stackoverflow.com/questions/32535273/how-to-match-dataframe-column-names-to-scala-case-class-attributes) –

+0

Czy wypróbowałeś swój kod z Spark 2.0? Mam do czynienia z 7000 kolumnami, zobacz https://github.com/ramhiser/datamicroarray/wiki/Golub-(1999). Trwa to wiecznie (= nigdy się nie skończyło, zanim skończy się moja cierpliwość). – Boern

0

I heve prostu znaleźć odpowiedź

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

na stackoverflow here (patrz koniec przyjętego odpowiedź)

-1

Chociaż to nie jest odpowiedź na swoje pytanie bezpośrednio, ale zawsze aktualizuję nazwy kolumn jeden po drugim. Ponieważ aktualizuje tylko metadane DF, nie ma nic złego (nie ma wpływ na wydajność) na aktualizowanie nazwy kolumn, jeden po drugim, np .:

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

Bez szkody? Czy próbowałeś tego w setkach kolumn? Zrobiłem i zadanie nie powiodło się z błędem stackoverflow po trzech godzinach. Przyjęta odpowiedź zamiast tego natychmiast zmieniła nazwę setek kolumn. –

+0

Tak, testowałem to. Która wersja Spark? Użyłem tego na stole z ponad 700 kolumnami. W Spark 1.5/CDH 5.5. Ponownie, DF.withColumnRenamed właśnie aktualizuje metadane DF, więc jest bardzo szybki. Jesteś pewien, że to ta część, która daje Ci przepływ startover? Może to być błąd Sparka, na który biegasz. Proszę podać kompletny kod. Jestem pewien, że kod działa, użyłem go w naszych zadaniach produkcyjnych. – Tagar

+0

Użyłem "Spark 1.6.2" i Scala zamiast Javy. Czy DataFrames jest zmienna w Javie i nie tworzy nowej instancji przy każdej iteracji? Jeśli tak, to wyjaśniłoby, dlaczego to działa. –

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

Edytuj i uzyskaj więcej informacji. Tylko kod i odpowiedź "spróbuj tego" są odradzane, ponieważ nie zawierają treści do wyszukiwania i nie wyjaśniają, dlaczego ktoś powinien "spróbować tego". Staramy się być źródłem wiedzy. – abarisone

Powiązane problemy