Scala 将一个数据帧列值传递给另一个数据帧筛选器条件表达式+;火花1.5

Scala 将一个数据帧列值传递给另一个数据帧筛选器条件表达式+;火花1.5,scala,apache-spark,spark-dataframe,Scala,Apache Spark,Spark Dataframe,我有两个输入数据集 第一个输入数据集如下所示: year,make,model,comment,blank "2012","Tesla","S","No comment", 1997,Ford,E350,"Go get one now they are going fast", 2015,Chevy,Volt 第二个输入数据集: TagId,condition 1997_cars,year = 1997 and model = 'E350' 2012_cars,year=2012 and mo

我有两个输入数据集 第一个输入数据集如下所示:

year,make,model,comment,blank
"2012","Tesla","S","No comment",
1997,Ford,E350,"Go get one now they are going fast",
2015,Chevy,Volt
第二个输入数据集:

TagId,condition
1997_cars,year = 1997 and model = 'E350'
2012_cars,year=2012 and model ='S'
2015_cars ,year=2015 and model = 'Volt'
现在,我的需求是读取第一个数据集,并且根据第二个数据集中的过滤条件,需要通过在第一个输入数据集中引入一个新列TagId来标记第一个输入数据集的行 因此,预期结果应该如下所示:

year,make,model,comment,blank,TagId
"2012","Tesla","S","No comment",2012_cars
1997,Ford,E350,"Go get one now they are going fast",1997_cars
2015,Chevy,Volt, ,2015_cars
我试着说:

val sqlContext = new SQLContext(sc)
val carsSchema = StructType(Seq(
    StructField("year", IntegerType, true),
    StructField("make", StringType, true),
    StructField("model", StringType, true),
    StructField("comment", StringType, true),
    StructField("blank", StringType, true)))

val carTagsSchema = StructType(Seq(
    StructField("TagId", StringType, true),
    StructField("condition", StringType, true)))


val dfcars = sqlContext.read.format("com.databricks.spark.csv").option("header", "true") .schema(carsSchema).load("/TestDivya/Spark/cars.csv")
val dftags = sqlContext.read.format("com.databricks.spark.csv").option("header", "true") .schema(carTagsSchema).load("/TestDivya/Spark/CarTags.csv")

val Amendeddf = dfcars.withColumn("TagId", dfcars("blank"))
val cdtnval = dftags.select("condition")
val df2=dfcars.filter(cdtnval)
<console>:35: error: overloaded method value filter with alternatives:
  (conditionExpr: String)org.apache.spark.sql.DataFrame <and>
  (condition: org.apache.spark.sql.Column)org.apache.spark.sql.DataFrame
 cannot be applied to (org.apache.spark.sql.DataFrame)
       val df2=dfcars.filter(cdtnval)
如果有人告诉我如何将过滤条件传递给dataframe的过滤函数,我将不胜感激。 或者其他解决方案。 我对scala和Spark这样一个幼稚的问题很感兴趣


谢谢

这个问题没有简单的解决办法。我认为有两个大致方向可以遵循:

  • 将条件(
    dftags
    )收集到本地列表中。然后一个接一个地检查它,作为
    过滤器
    在cars(
    dfcars
    )上执行每个操作。使用结果获得所需的输出

  • 将条件(
    dftags
    )收集到本地列表中。自己为它们实现解析和评估代码。对车辆(
    dfcars
    )进行一次检查,评估
    地图中每一行的规则集


如果你有大量的条件(因此你不能收集它们)和大量的汽车,那么情况是非常糟糕的。你需要检查每辆车的每一个状况,所以这将是非常低效的。在这种情况下,您需要首先优化规则集,以便更有效地对其进行评估。(决策树可能是一个很好的解决方案。)

没有简单的解决方案。我认为有两个大致方向可以遵循:

  • 将条件(
    dftags
    )收集到本地列表中。然后一个接一个地检查它,作为
    过滤器
    在cars(
    dfcars
    )上执行每个操作。使用结果获得所需的输出

  • 将条件(
    dftags
    )收集到本地列表中。自己为它们实现解析和评估代码。对车辆(
    dfcars
    )进行一次检查,评估
    地图中每一行的规则集


如果你有大量的条件(因此你不能收集它们)和大量的汽车,那么情况是非常糟糕的。你需要检查每辆车的每一个状况,所以这将是非常低效的。在这种情况下,您需要首先优化规则集,以便更有效地对其进行评估。(决策树可能是一个很好的解决方案。)

如何将DFTAG转换为列表?你能举个例子吗。我不熟悉Spark和Scala。我的意思是简单地
dftags.collect
。它将分布式RDD转换为一个简单的数组。如何将DFTAG转换为列表?你能举个例子吗。我不熟悉Spark和Scala。我的意思是简单地
dftags.collect
。它将分布式RDD转换为一个简单的数组。
val col = dftags.col("TagId")
val finaldf = dfcars.withColumn("TagId", col)
org.apache.spark.sql.AnalysisException: resolved attribute(s) TagId#5 missing from comment#3,blank#4,model#2,make#1,year#0 in operator !Project [year#0,make#1,model#2,comment#3,blank#4,TagId#5 AS TagId#8];

finaldf.write.format("com.databricks.spark.csv").option("header", "true").save("/TestDivya/Spark/carswithtags.csv")