我可以array_contains用來檢查陣列是否包含一個值。
test = test.withColumn("my_boolean",
F.when(expr("array_contains('check_variable', 'a')"),
1)
.otherwise(0))
我想測驗多個值,而不是測驗一個值。我可以嵌套:
test = test.withColumn("my_boolean",
F.when(expr("array_contains('check_variable', 'a')"),
1)
F.when(expr("array_contains('check_variable', 'b')"),
1)
.otherwise(0))
有沒有辦法在一個陳述句中做到這一點,偽代碼:
test = test.withColumn("my_boolean",
F.when(expr("array_contains('check_variable', ['a','b'])"),
1)
.otherwise(0))
uj5u.com熱心網友回復:
您可以array_intersect在兩個陣列上使用,如果交集大于 0,則陣列中至少有一個值。
例子:
spark = SparkSession.builder.getOrCreate()
data = [
{"id": 1, "test": ["A", "B"]},
{"id": 2, "test": ["E", "C"]},
{"id": 3, "test": ["D", "B"]},
]
df = spark.createDataFrame(data)
df = df.withColumn(
"result",
F.when(
F.size(F.array_intersect(F.col("test"), F.array(F.lit("A"), F.lit("B"))))
> 0,
1,
).otherwise(0),
)
結果:
--- ------ ------
| id| test|result|
--- ------ ------
| 1|[A, B]| 1|
| 2|[E, C]| 0|
| 3|[D, B]| 1|
--- ------ ------
如果你想使用expr:
F.when(
F.expr("size(array_intersect(test, array('A', 'B'))) > 0"),
1,
).otherwise(0)
uj5u.com熱心網友回復:
在 中spark>=2.4,您可以使用array_intersect并檢查輸出的大小是否與您要查找的值的數量相同(在您的示例中為 2)。
pyspark.sql.functions.array_intersect(col1, col2)集合函式:回傳col1和col2交集的元素組成的陣列,沒有重復。
代碼可能如下:
test = test.withColumn("my_boolean",
f.expr("size(array_intersect(check_variable, array(a, b))) > 0").cast("int"))
請注意,將布林值轉換為 0/1 值的另一種方法是將其轉換為 int。
如果有人對spark<2.4解決方案感興趣,可以基于array_contains并通過迭代列陣列來構建一個函式:
from functools import reduce
def contains_at_least_one(a):
contains = map(lambda v: f.array_contains('check_variable', f.col(v)), a)
return reduce(lambda x, y: x | y, contains)
test = test.withColumn("my_boolean",
contains_at_least_one(['a', 'b']).cast("int"))
uj5u.com熱心網友回復:
您正在尋找的功能稱為arrays_overlap:
arrays_overlap(a1, a2)- 如果 a1 至少包含一個也存在于 a2 中的非空元素,則回傳 true
import pyspark.sql.functions as F
test = test.withColumn(
"my_boolean",
F.expr("arrays_overlap(check_variable, array('a','b'))").cast("int")
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/350181.html
下一篇:在PySpark中顯示物理計劃
