scala 基于其他DataFrame数据从DataFrame中筛选出数据时出现不支持该功能错误

ddrv8njm  于 2022-11-09  发布在  Scala
关注(0)|答案(3)|浏览(170)

我想从所有 Dataframe 中筛选出那些类型出现在错误类型 Dataframe 中的记录(它有大约2000条记录)。我将错误类型df转换为字符串列表,然后在筛选器中检查记录是否在该列表中。以下是我的代码:

import org.apache.spark.sql.functions._
import spark.implicits._

val allData = Seq(
  ("id1", "X"),
  ("id2", "X"),
  ("id3", "Y"),
  ("id4", "A")
).toDF("id", "type")

val wrongTypes = Seq(
  ("X"),
  ("Y"),
  ("Z")
  ).toDF("type").select("type").map(r => r.getString(0)).collect.toList

allData.filter(col("type").isin(wrongTypes)).show()

我得到了这个错误:

SparkRuntimeException: The feature is not supported: literal for 'List(X, Y, Z)' of class scala.collection.immutable.$colon$colon.
tf7tbtn2

tf7tbtn21#

allData.filter(col("type").isInCollection(wrongTypes)).show()
57hvy0tb

57hvy0tb2#

isin()是具有可变数目参数的函数,如果要将集合传递给它,则必须使用Splat运算符:

col("type").isin(wrongTypes:_*)

另一种选择是使用参数为IterableisInCollection()。我建议使用它,就像您提到的那样,您预计大约有2K个条目。

whlutmcx

whlutmcx3#

如果wrongTypes Dataframe 很大,您可能不想收集结果,而只使用 Dataframe 。
我不确定如何在 Dataframe 级别上表示它,但在SQL术语中,您希望使用IN子句,如下所示:

allData.createOrReplaceTempView("all_data")
wrongTypes.createOrReplaceTempView("wrong_types")

spark.sql("""
    SELECT 
      * 
    FROM all_data
    WHERE type in (SELECT type FROM wrong_types)
""").show()

相关问题