2017-02-07 46 views
1

假設我有以下的情況下如何檢查數組列是pyspark數據幀的另一列陣列內

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) 

這給了我:

​​

我想創建一個布爾值的新列(或僅選擇真實情況),其中「ev」列的內容位於「ev2」列內,返回:

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

或:

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之間的差異長度。當結果數組的長度爲0ev的所有元素都包含在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

相關問題