Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在spark数据帧中执行字符串作为查询_Scala_Apache Spark_Dataframe - Fatal编程技术网

Scala 在spark数据帧中执行字符串作为查询

Scala 在spark数据帧中执行字符串作为查询,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,我使用的数据如下: df1的数据: c1,c2,c3,c4 k1,i,aa,k k5,j,ee,l df2的数据: c1,avc2,c3,avc4 k1,a,aa,e k2,b,bb,f k3,c,cc,g k4,d,dd,h 我正在尝试使用以下代码根据条件创建动态查询字符串: val PRIM_CHECK="c1,c3".split(",").toList val COLUMN_UNCHANGE="c4".split(",").toList var qb = new ListBuffer[

我使用的数据如下:

df1的数据:

c1,c2,c3,c4
k1,i,aa,k
k5,j,ee,l
df2的数据:

c1,avc2,c3,avc4
k1,a,aa,e
k2,b,bb,f
k3,c,cc,g
k4,d,dd,h
我正在尝试使用以下代码根据条件创建动态查询字符串:

val PRIM_CHECK="c1,c3".split(",").toList
val COLUMN_UNCHANGE="c4".split(",").toList
var qb = new ListBuffer[String]()
val df3=df1.join(df2,seq("c1","c3"), "outer")
    for(i<-avro_inp.columns) 
        {
      if(PRIM_CHECK.contains(i))
        {

        }
      else if(COLUMN_UNCHANGE.contains(i)) 
        {
        qb+=""".withColumn(""""+i+"""", when('"""+""+i+""".isNotNull,'"""+i+""").otherwise('av"""+""+i+"""))"""
         }
      else
        {
          qb+=""".withColumn(""""+i+"""", when('av"""+""+i+""".isNull,'"""+i+""").otherwise('av"""+""+i+"""))"""
        }

  }

    val check=qb.mkString

但是,由于查询中的字符串,我无法运行上述代码。有什么方法可以执行它吗?

您不能在字符串中编写scala代码并“执行”该字符串(类似于
eval
)。也许有黑客可以做到这一点,但这绝对不是如何编写spark/scala代码

我建议这样做:

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

val df_result = avro_inp.columns.foldLeft(df3) { case (df, i) =>
  if (PRIM_CHECK.contains(i)) {
    df
  }
  else if (PRIM_CHECK.contains(i)) {
    df.withColumn(i, when(col(i).isNotNull, col(i)).otherwise(col("av" + i)))
  }
  else {
    df.withColumn(i, when(col(i).isNull, col(i)).otherwise(col("av" + i)))
  }
} 

df_result.show
或者使用for循环和定义为
var
df\u结果:

var df_result = df3

for (i <- avro_inp.columns) {
  if (PRIM_CHECK.contains(i)) {
  }
  else if (PRIM_CHECK.contains(i)) {
    df_result = df_result.withColumn(i, when(col(i).isNotNull, col(i)).otherwise(col("av" + i)))
  }
  else {
    df_result = df_result.withColumn(i, when(col(i).isNull, col(i)).otherwise(col("av" + i)))
  }
var df_result=df3

对于(我耶稣,这很难看:)@RaphaelRoth我需要创建一个带有很多条件的动态查询。我没有找到更好的方法。但我无法想象这会起作用,你用字符串编写scala代码,这不会执行。我的答案解决了你的问题?那就请接受吧
var df_result = df3

for (i <- avro_inp.columns) {
  if (PRIM_CHECK.contains(i)) {
  }
  else if (PRIM_CHECK.contains(i)) {
    df_result = df_result.withColumn(i, when(col(i).isNotNull, col(i)).otherwise(col("av" + i)))
  }
  else {
    df_result = df_result.withColumn(i, when(col(i).isNull, col(i)).otherwise(col("av" + i)))
  }