당신이 당신의 문자열 열을 서브 세트 문자열 목록을 사용하는 경우는, 가장 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_replace
및 concat
를 사용하여
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]', ' ')))
'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
thanks @ zero323! – mtoto
네, 유효한 답변이지만, 슬프게도 제가 작업하고있는 응용 프로그램에 대해서는 비실용적입니다. 미안하지만 이걸 지정하지 않았어. 나는 1000 만 개가 넘는 문서 ("하나"로되어 있음)와 중첩 된'사전 (dictionary) '을 얻었습니다. 5 백만 개 이상의 핵심 단어를 가지고 일치 시키려하고 결과를'two '로 지정하려고합니다. Regex는 나의 첫 번째 접근 방식 이었지만'like '와'is in'는 더 빠르므로 그들을 통합하는 해결책을 찾으려고 노력했다. – Thagor