2017-02-07 4 views
1

가정하자 나는 나를주는 다음과 같은 경우를 확인하는 방법

from pyspark.sql.types import * 
schema = StructType([ # schema 
    StructField("id", StringType(), True), 
    StructField("ev", ArrayType(StringType()), True), 
    StructField("ev2", ArrayType(StringType()), True),]) 
df = spark.createDataFrame([{"id": "se1", "ev": ["ev11", "ev12"], "ev2": ["ev11"]}, 
          {"id": "se2", "ev": ["ev11"], "ev2": ["ev11", "ev12"]}, 
          {"id": "se3", "ev": ["ev21"], "ev2": ["ev11", "ev12"]}, 
          {"id": "se4", "ev": ["ev21", "ev22"], "ev2": ["ev21", "ev22"]}], 
          schema=schema) 

있습니다

df.show() 
+---+------------+------------+ 
| id|   ev|   ev2| 
+---+------------+------------+ 
|se1|[ev11, ev12]|  [ev11]| 
|se2|  [ev11]|[ev11, ev12]| 
|se3|  [ev21]|[ev11, ev12]| 
|se4|[ev21, ev22]|[ev21, ev22]| 
+---+------------+------------+ 

내가 부울의 새 열을 만들려면에게 "ev"열의 내용이 "ev2"열 안에있는 행에 대해 (또는 실제 사례 만 선택하여) 다음을 반환하는 결과를 반환합니다.

나 :

df_target.show() 
+---+------------+------------+-------+ 
| id|   ev|   ev2|evInEv2| 
+---+------------+------------+-------+ 
|se1|[ev11, ev12]|  [ev11]| false| 
|se2|  [ev11]|[ev11, ev12]| true| 
|se3|  [ev21]|[ev11, ev12]| false| 
|se4|[ev21, ev22]|[ev21, ev22]| true| 
+---+------------+------------+-------+ 
나는 isin 방법을 사용하여 시도

:

df.withColumn('evInEv2', df['ev'].isin(df['ev2'])).show() 
+---+------------+------------+-------+ 
| id|   ev|   ev2|evInEv2| 
+---+------------+------------+-------+ 
|se1|[ev11, ev12]|  [ev11]| false| 
|se2|  [ev11]|[ev11, ev12]| false| 
|se3|  [ev21]|[ev11, ev12]| false| 
|se4|[ev21, ev22]|[ev21, ev22]| true| 
+---+------------+------------+-------+ 

를하지만이 같은 배열의 경우이 같은 경우에만 검사 보인다.

또한 pyspark.sql.functions에서 array_contains 함수를 시도했지만 검사 할 배열이 아닌 하나의 객체 만 허용했습니다.

올바른 문제를 말하기 때문에이 문제를 검색하는 데 어려움이 있습니다.

감사합니다.

답변

3

여기에 udf을 사용하는 옵션이 있습니다. 여기서 evev2 사이의 차이 길이를 확인합니다. 결과 배열의 길이가 0이거나 ev의 모든 요소가 ev2에 포함되면 True을 반환합니다. 그렇지 않으면 False.

def contains(x,y): 
    z = len(set(x) - set(y)) 
    if z == 0: 
    return True 
    else: 
    return False 

contains_udf = udf(contains) 
df.withColumn("evInEv2", contains_udf(df.ev,df.ev2)).show() 
+---+------------+------------+-------+ 
| id|   ev|   ev2|evInEv2| 
+---+------------+------------+-------+ 
|se1|[ev11, ev12]|  [ev11]| false| 
|se2|  [ev11]|[ev11, ev12]| true| 
|se3|  [ev21]|[ev11, ev12]| false| 
|se4|[ev21, ev22]|[ev21, ev22]| true| 
+---+------------+------------+-------+ 
+0

효과가있었습니다. 감사! 나는 udfs 사용에 대해서 생각조차하지 않았다. – dtj