15

Dataframe.explode이 유용한 방법이라고 제안했지만, 원래 데이터 프레임보다 많은 행이 생성된다는 것을 여러 사람들이 보았습니다.Split 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 

내가 알고 있는데 나는 단순히 매우 간단의 Dataframe에 해당하고 싶어 pyspark.sql.functions.split(),하지만 원하는 두 개의 최상위 열 대신 중첩 된 배열 열을 결과.

이상적으로이 새로운 열의 이름도 지정하는 것이 좋습니다.

답변

26

pyspark.sql.functions.split()이 올바른 접근 방식입니다. 중첩 된 ArrayType 열을 여러 최상위 열로 병합하면됩니다. 이 경우 각 배열에는 2 개의 항목 만 포함되어 있으므로 매우 쉽습니다.

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

는 결과가 될 것입니다 : 당신은 단순히 열 자체로 배열의 각 부분을 검색 할 Column.getItem()를 사용

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

나는 일반적인 경우에이 문제를 해결 얼마나 확실하지 않다 어디 중첩 배열은 행에서 행까지 동일한 크기가 아니 었습니다.

+0

일반적인 고르지 않은 경우에 대한 해결책을 찾았습니까? –

+0

불행히도 나는 결코하지 않았다. –

+2

파이썬 루프를 사용하여 끝났다 - 범위 (최대 (len_of_split) : df = df.withcolumn (split.getItem (i)) –

관련 문제