, , , struct arrays. , Spark SQL , array(1, 'a') array<string>.
, :
choices = [(100, 'A'), (200, 'B')]
target = [
struct(
lit(number).alias("number").cast("long"),
lit(letter).alias("letter").cast("string"))
for number, letter in choices]
query = struct("number", "letter").isin(target)
, :
query
Column<b'(named_struct(NamePlaceholder(), number, NamePlaceholder(), letter) IN (named_struct(col1, CAST(100 AS `number` AS BIGINT), col2, CAST(A AS `letter` AS STRING)), named_struct(col1, CAST(200 AS `number` AS BIGINT), col2, CAST(B AS `letter` AS STRING))))'>
- :
df.where(~query)
AnalysisException Traceback (most recent call last)
...
AnalysisException: "cannot resolve '(named_struct('number', `number`, 'letter', `letter`) IN (named_struct('col1', CAST(100 AS BIGINT), 'col2', CAST('A' AS STRING)), named_struct('col1', CAST(200 AS BIGINT), 'col2', CAST('B' AS STRING))))' due to data type mismatch: Arguments must be same type;;\n'Filter NOT named_struct(number, number#0L, letter, letter#1) IN (named_struct(col1, cast(100 as bigint), col2, cast(A as string)),named_struct(col1, cast(200 as bigint), col2, cast(B as string)))\n+- LogicalRDD [number#0L, letter#1, id#2L]\n"
, SQL :
df.createOrReplaceTempView("df")
spark.sql("SELECT * FROM df WHERE struct(letter, letter) IN (struct(CAST(1 AS bigint), 'a'))")
AnalysisException: "cannot resolve '(named_struct('letter', df.`letter`, 'letter', df.`letter`) IN (named_struct('col1', CAST(1 AS BIGINT), 'col2', 'a')))' due to data type mismatch: Arguments must be same type; line 1 pos 46;\n'Project [*]\n+- 'Filter named_struct(letter, letter#1, letter, letter#1) IN (named_struct(col1, cast(1 as bigint), col2, a))\n +- SubqueryAlias df\n +- LogicalRDD [number#0L, letter#1, id#2L]\n"
:
spark.sql("SELECT * FROM df WHERE struct(CAST(1 AS bigint), 'a') IN (struct(CAST(1 AS bigint), 'a'))")
DataFrame[number: bigint, letter: string, id: bigint]
, .
, - :
from pyspark.sql.functions import broadcast
df.join(
broadcast(spark.createDataFrame(choices, ("number", "letter"))),
["number", "letter"],
"leftanti"
)
+------+------+---+
|number|letter| id|
+------+------+---+
| 300| C|306|
+------+------+---+