15

我見過各種各樣的人暗示Dataframe.explode是實現此目的的一種有用方法,但它會產生比原始數據幀更多的行,這不是我想要的。我只想做數據框相當於非常簡單的:將Spark數據幀字符串列拆分爲多列

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

這需要的東西看起來像:

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

,並把它轉換成這樣:

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

我所知道的pyspark.sql.functions.split(),但它會產生一個嵌套的數組列,而不是像我想要的兩個頂級列。

理想情況下,我想要命名這些新列。

回答

26

pyspark.sql.functions.split()這裏是正確的方法 - 你只需要將嵌套的ArrayType列平鋪爲多個頂級列。在這種情況下,每個數組只包含2個項目,這非常容易。您只需使用Column.getItem()檢索陣列的每個部分作爲列本身:

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)) 

結果將是:

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

我不知道我怎麼會在一般情況下,解決這個問題,其中Row to Row中嵌套數組的大小不一樣。

+0

您是否找到了針對一般不均勻情況的解決方案? –

+0

不幸的是我從來沒有。 –

+2

結束了使用python循環,即 - 對於我在範圍內(最大(len_of_split):df = df.withcolumn(split.getItem(i)) –