Scala: передача элементов Dataframe из каждой строки и получение результата в отдельных строках - PullRequest
0 голосов
/ 28 сентября 2018

В Моем требовании я сталкиваюсь с ситуацией, когда мне нужно передать 2 строки из 2 столбца моего информационного кадра, получить результат в виде строки и сохранить его обратно в информационном кадре.Теперь, передавая значение в виде строки, оно всегда возвращает одно и то же значение.Таким образом, во всех строках заполняется одно и то же значение.(В моем случае PPPP заполняется во всех строках)

Есть ли способ передать элемент (для этих 2 столбцов) из каждой строки и получить результат в отдельных строках.Я готов изменить свою функцию, чтобы принимать Dataframe и возвращать Dataframe ИЛИ принимать arrayOfString и возвращать ArrayOfString, но я не знаю, как это сделать, поскольку я новичок в программировании.Может кто-нибудь, пожалуйста, помогите мне.Спасибо.

def myFunction(key: String , value :String ) : String =   {

  //Do my functions and get back a string value2 and return this value2 string
value2

}



val DF2 = DF1.select (
  DF1("col1")
 ,DF1("col2")
 ,DF1("col5")    )
 .withColumn("anyName", lit(myFunction ( DF1("col3").toString()  , DF1("col4").toString() )))




/* DF1:

/*+-----+-----+----------------+------+
/*|col1 |col2 |col3     | col4 | col 5|
/*+-----+-----+----------------+------+
/*|Hello|5    |valueAAA | XXX  | 123  |
/*|How  |3    |valueCCC | YYY  | 111  |
/*|World|5    |valueDDD | ZZZ  | 222  |
/*+-----+-----+----------------+------+


/*DF2:

/*+-----+-----+--------------+
/*|col1 |col2 |col5| anyName |
/*+-----+-----+--------------+
/*|Hello|5    |123 | PPPPP   |
/*|How  |3    |111 | PPPPP   |
/*|World|5    |222 | PPPPP   |
/*+-----+-----+--------------+ 
*/

1 Ответ

0 голосов
/ 28 сентября 2018

После того, как вы определили функцию, вам нужно зарегистрировать их как udf ().Функция udf () доступна в org.apache.spark.sql.functions.проверить это

scala> val DF1 = Seq(("Hello",5,"valueAAA","XXX",123),
     | ("How",3,"valueCCC","YYY",111),
     | ("World",5,"valueDDD","ZZZ",222)
     | ).toDF("col1","col2","col3","col4","col5")
DF1: org.apache.spark.sql.DataFrame = [col1: string, col2: int ... 3 more fields]

scala> val DF2 = DF1.select (  DF1("col1") ,DF1("col2") ,DF1("col5")    )
DF2: org.apache.spark.sql.DataFrame = [col1: string, col2: int ... 1 more field]

scala> DF2.show(false)
+-----+----+----+
|col1 |col2|col5|
+-----+----+----+
|Hello|5   |123 |
|How  |3   |111 |
|World|5   |222 |
+-----+----+----+


scala> DF1.select("*").show(false)
+-----+----+--------+----+----+
|col1 |col2|col3    |col4|col5|
+-----+----+--------+----+----+
|Hello|5   |valueAAA|XXX |123 |
|How  |3   |valueCCC|YYY |111 |
|World|5   |valueDDD|ZZZ |222 |
+-----+----+--------+----+----+

scala> def myConcat(a:String,b:String):String=
     | return a + "--" + b
myConcat: (a: String, b: String)String

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

scala> val myConcatUDF = udf(myConcat(_:String,_:String):String)
myConcatUDF: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function2>,StringType,Some(List(StringType, StringType)))

scala> DF1.select (  DF1("col1") ,DF1("col2") ,DF1("col5"), myConcatUDF( DF1("col3"), DF1("col4"))).show()
+-----+----+----+---------------+
| col1|col2|col5|UDF(col3, col4)|
+-----+----+----+---------------+
|Hello|   5| 123|  valueAAA--XXX|
|  How|   3| 111|  valueCCC--YYY|
|World|   5| 222|  valueDDD--ZZZ|
+-----+----+----+---------------+


scala>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...