Я хочу автоматизировать процесс изменения значений столбца столбца pos, сгенерированного при использовании функции posexplode: Ниже приведен мой код:
val someDF = Seq(
(8, "bat","1a","2a"),
(64, "mouse","1b","2b"),
(-27, "horse","1c","2c")
).toDF("number", "word","cat1","cat2")
val col2 =someDF.columns.slice(2,10)
val collist=col2.mkString(",")
val fg=col2.zipWithIndex
someDF.createOrReplaceTempView("mydf")
val newDf=spark.sql("""select *,posexplode(array("""+collist+""")) from mydf""")
val myac=fg.map({case (f,i)=>".when(newDf("+"\""+"pos"+"\"" +")" + "===" + i +","+"regexp_replace(col("+"\""+"pos"+"\""+"),"+ "\""+i+"\""+"," +"\""+f+"\""+"))"}).mkString("").stripPrefix(".")
при попытке выполнить способом stati c, как показано ниже. отлично работает:
newDf.withColumn("Category", when(newDf("pos")===0, regexp_replace(col("pos"),"0","cat1")).when(newDf("pos")===1, regexp_replace(col("pos"),"1","cat2")))
output:
------+-----+----+----+---+---+--------+
|number| word|cat1|cat2|pos|col|Category|
+------+-----+----+----+---+---+--------+
| 8| bat| 1a| 2a| 0| 1a| cat1|
| 8| bat| 1a| 2a| 1| 2a| cat2|
| 64|mouse| 1b| 2b| 0| 1b| cat1|
| 64|mouse| 1b| 2b| 1| 2b| cat2|
| -27|horse| 1c| 2c| 0| 1c| cat1|
| -27|horse| 1c| 2c| 1| 2c| cat2|
+------+-----+----+----+---+---+--------+
цель состоит в том, чтобы добиться того же в динамике c путь, который терпит неудачу
val newdf1=newDf.withcolumn("Category",myac)
val newdf1=newDf.withColumn("Level",s"${myac}")
ERROR:command-1732554743656721:1: error: type mismatch;
found : String
required: org.apache.spark.sql.Column
Любая идея или предложение, как решить эту проблему, будут полезны