Как вставить динамически разработанный строковый запрос в функцию столбца scala - PullRequest
0 голосов
/ 25 апреля 2020

Я хочу автоматизировать процесс изменения значений столбца столбца 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

Любая идея или предложение, как решить эту проблему, будут полезны

1 Ответ

0 голосов
/ 25 апреля 2020

Ваша переменная myac имеет тип String. если вы хотите использовать эту переменную внутри withColumn, вы должны использовать функцию lit(). lit функция конвертирует ваше строковое значение в столбец.

Ваша ошибка говорит о том, что вы передаете строку, но ее обязательный столбец.

ERROR:command-1732554743656721:1: error: type mismatch; found : String required: org.apache.spark.sql.Column newDf.withColumn("Level",s"${myac}")

Проверьте ниже.

myac: String = when(newDf("pos")===0,regexp_replace(col("pos"),"0","hat")).when(newDf("pos")===1,regexp_replace(col("pos"),"1","cat"))

newDf.withColumn("Level",lit(s"${myac}")) // here I have changed s"${myac}" to lit(s"${myac}"

...