Scala 在spark数据帧中执行字符串作为查询
我使用的数据如下: df1的数据: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[
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)))
}