Как перебрать данные кадра без конвертации в набор данных в искре? - PullRequest
0 голосов
/ 28 марта 2019

У меня есть фрейм данных, через который я хочу перебрать, но я не хочу конвертировать фрейм данных в набор данных. Мы должны преобразовать код spark scala в pyspark, а pyspark не поддерживает набор данных.

Я пробовал следующий код с преобразованием в набор данных

data in file:

abc,a
mno,b
pqr,a
xyz,b

val a = sc.textFile("<path>")

//creating dataframe with column AA,BB

val b = a.map(x => x.split(",")).map(x =>(x(0).toString,x(1).toString)).toDF("AA","BB") 

b.registerTempTable("test")

case class T(AA:String, BB: String)

//creating dataset from dataframe

val d = b.as[T].collect       

d.foreach{ x=>
    var m = spark.sql(s"select * from test where BB = '${x.BB}'")
    m.show()
}

Without converting to dataset it gives error i.e. with

val d = b.collect

d.foreach{ x=>
    var m = spark.sql(s"select * from test where BB = '${x.BB}'")
    m.show()
}

выдает ошибку: ошибка: значение BB не является членом org.apache.spark.sql.ROW

1 Ответ

0 голосов
/ 29 марта 2019

Вы не можете зациклить цикл данных, как вы указали в приведенном выше коде.Используйте цикл данных rdd.collect для цикла данных.

import spark.implicits._
val df = Seq(("abc","a"), ("mno","b"), ("pqr","a"),("xyz","b")).toDF("AA", "BB")
df.registerTempTable("test")
df.rdd.collect.foreach(x => {
     val BBvalue = x.mkString(",").split(",")(1)
     var m = spark.sql(s"select * from test where BB = '$BBvalue'")
     m.show()
})

Внутри цикла я использовал mkString, чтобы преобразовать строку rdd в строку, а затем разделить значения столбца запятой и использовать индекс столбца для доступа кзначение.Например, в приведенном выше коде я использовал (1), что означает, что столбец BB индекс столбца равен 2.

enter image description here

Пожалуйста, дайте мне знатьесли у вас есть какие-либо вопросы.

...