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
功能,但僅接受一個對象,而不是一個數組進行檢查。
即使是因爲措辭正確的問題而尋找此問題,我也遇到了困難。
謝謝!
它的工作!謝謝!我甚至沒有考慮過使用udfs – dtj