15

Widziałem różne osoby sugerujące, że Dataframe.explode jest przydatnym sposobem, aby to zrobić, ale powoduje to więcej wierszy niż oryginalna ramka danych, co nie jest tym, czego w ogóle chcę. Ja po prostu chcę zrobić równowartość Dataframe na bardzo prosty:Podziałowa kolumna łańcucha danych Datastrame na wiele kolumn

rdd.map(lambda row: row + [row.my_str_col.split('-')]) 

która zaczyna coś wyglądające jak:

col1 | my_str_col 
-----+----------- 
    18 | 856-yygrm 
201 | 777-psgdg 

i konwertuje go do tego:

col1 | my_str_col | _col3 | _col4 
-----+------------+-------+------ 
    18 | 856-yygrm | 856 | yygrm 
201 | 777-psgdg | 777 | psgdg 

Jestem świadomy pyspark.sql.functions.split(), ale spowoduje to zagnieżdżoną kolumnę tablicy zamiast dwóch kolumn najwyższego poziomu, jak chcę.

Idealnie, chcę, aby te nowe kolumny również zostały nazwane.

Odpowiedz

26

pyspark.sql.functions.split() jest tutaj właściwym podejściem - wystarczy spłaszczyć zagnieżdżoną kolumnę ArrayType do wielu kolumn najwyższego poziomu. W tym przypadku, gdy każda tablica zawiera tylko 2 elementy, jest to bardzo łatwe. Po prostu użyć Column.getItem() odzyskać każdą część tablicy jako kolumna sama:

split_col = pyspark.sql.functions.split(df['my_str_col'], '-') 
df = df.withColumn('NAME1', split_col.getItem(0)) 
df = df.withColumn('NAME2', split_col.getItem(1)) 

Rezultatem będzie:

col1 | my_str_col | NAME1 | NAME2 
-----+------------+-------+------ 
    18 | 856-yygrm | 856 | yygrm 
201 | 777-psgdg | 777 | psgdg 

nie jestem pewien, w jaki sposób mogę rozwiązać to w ogólnym przypadku, gdy zagnieżdżone tablice nie miały tego samego rozmiaru od wiersza do wiersza.

+0

czy znalazłeś rozwiązanie dla ogólnego, niejednorodnego przypadku? –

+0

Niestety, nigdy tego nie zrobiłem. –

+2

zakończył się przy użyciu pętli python, tj. - dla i w zakresie (max (len_of_split): df = df.withcolumn (split.getItem (i)) –