2017-04-25 1 views
1

이 내 예를 들어 dataframe를 생성 여기서 two 열이불꽃 dataframe 업데이트 열

"의사 코드"와 일치하는지 여부에 관계없이 다음과 같이 추가됩니다.

for letter in ['a','b','c','d']: 
    df = df['two'].where(col('one').like("%{}%".format(letter))) += letter 

(210)는 마지막으로 다음과 같이보고 DF 결과 :

+---+----+ 
|one| two| 
+---+----+ 
|abc|zabc| 
|def| zd| 
+---+----+ 

답변

4

당신이 당신의 문자열 열을 서브 세트 문자열 목록을 사용하는 경우는, 가장 broadcast 변수를 사용할 수 있습니다. 의 당신의 문자열이 여전히 공백이 포함 된보다 현실적인 예를 들어 시작하자 :

다음
df = sc.parallelize([('a b c',),('d e f',)]).toDF() 
df = df.selectExpr("_1 as one",) 
df = df.withColumn("two", lit('z')) 

우리는 문자의 목록에서 broadcast 변수를 생성하고, 그 결과 문자열 목록을 서브 세트를 사용하는 udf 정의; 그리고 마지막으로 하나의 문자열 반환, 다른 열의 값과 그것들을 연결해 : 우리는 필요 부분 집합 된 문자열 목록으로 변환

letters = ['a','b','c','d'] 
letters_bd = sc.broadcast(letters) 

def subs(col1, col2): 

    l_subset = [x for x in col1 if x in letters_bd.value] 
    return col2 + ' ' + ' '.join(l_subset) 

subs_udf = udf(subs) 

위를 적용하기를, 그래서 우리는 split() 먼저 다음 적용 기능을 사용하여 우리 udf : 당신의 편지를 편안하게 할 것을 regex 표현에 들어갈 수있는 경우 regexp_replaceconcat를 사용하여

from pyspark.sql.functions import col, split 

df.withColumn("three", split(col('one'), r'\W+')) \ 
    .withColumn("three", subs_udf("three", "two")) \ 
    .show() 
+-----+---+-------+ 
| one|two| three| 
+-----+---+-------+ 
|a b c| z|z a b c| 
|d e f| z| z d| 
+-----+---+-------+ 

또는 udf없이

.

from pyspark.sql.functions import regexp_replace, col, concat, lit 

df.withColumn("three", concat(col('two'), lit(' '), 
       regexp_replace(col('one'), '[^abcd]', ' '))) 
+0

'expr'과'regexp_replace'는 현명한 선택이 될 수 있습니다. 그리고 2.1 이상에서는 ['regexp_replace'를 단독으로 사용할 수도 있습니다 (https://github.com/apache/spark/blob/v2.1.0/sql/core/src/main/scala/org/apache/spark/sql/). functions.scala # L2324) – zero323

+0

thanks @ zero323! – mtoto

+0

네, 유효한 답변이지만, 슬프게도 제가 작업하고있는 응용 프로그램에 대해서는 비실용적입니다. 미안하지만 이걸 지정하지 않았어. 나는 1000 만 개가 넘는 문서 ("하나"로되어 있음)와 중첩 된'사전 (dictionary) '을 얻었습니다. 5 백만 개 이상의 핵심 단어를 가지고 일치 시키려하고 결과를'two '로 지정하려고합니다. Regex는 나의 첫 번째 접근 방식 이었지만'like '와'is in'는 더 빠르므로 그들을 통합하는 해결책을 찾으려고 노력했다. – Thagor