Как преобразовать Dataframe в Список (Scala)? - PullRequest
0 голосов
/ 24 апреля 2019

Я хочу преобразовать Dataframe, который содержит значения Double, в List, чтобы я мог использовать его для расчетов.Каково ваше предложение, чтобы я мог взять правильный тип List (т.е. Double)?

Мой подход такой:

var newList = myDataFrame.collect().toList 

, но он возвращает тип Список [org.apache.spark.sql.Row] , который я не знаю, чтоэто точно!

Можно ли забыть этот шаг и просто передать мой Dataframe внутри функции и сделать из него вычисления?( Например, я хочу сравнить третий элемент его второго столбца с определенным двойным. Возможно ли это сделать прямо из моего Dataframe? )

Любой ценой, которую я должен понятькак каждый раз создавать правильный тип списка!

РЕДАКТИРОВАТЬ:

Входной кадр данных:

+---+---+ 
|_c1|_c2|
+---+---+ 
|0  |0  | 
|8  |2  | 
|9  |1  | 
|2  |9  | 
|2  |4  | 
|4  |6  | 
|3  |5  | 
|5  |3  | 
|5  |9  | 
|0  |1  | 
|8  |9  | 
|1  |0  | 
|3  |4  |
|8  |7  | 
|4  |9  | 
|2  |5  | 
|1  |9  | 
|3  |6  |
+---+---+

Результат после преобразования:

List((0,0), (8,2), (9,1), (2,9), (2,4), (4,6), (3,5), (5,3), (5,9), (0,1), (8,9), (1,0), (3,4), (8,7), (4,9), (2,5), (1,9), (3,6))

Но каждый элемент списка должен иметь тип Double.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2019

Вы можете разыграть необходимый вам кулон на Double и конвертировать его в СДР и collect это

Если у вас есть данные, которые не могут быть проанализированы, вы можете использовать udf для очистки перед приведением к удвоению

val stringToDouble = udf((data: String) => {
  Try (data.toDouble) match {
    case Success(value) => value
    case Failure(exception) => Double.NaN
  }
})

 val df = Seq(
   ("0.000","0"),
   ("0.000008","24"),
   ("9.00000","1"),
   ("-2","xyz"),
   ("2adsfas","1.1.1")
 ).toDF("a", "b")
  .withColumn("a", stringToDouble($"a").cast(DoubleType))
  .withColumn("b", stringToDouble($"b").cast(DoubleType))

После этого вы получите вывод как

+------+----+
|a     |b   |
+------+----+
|0.0   |0.0 |
|8.0E-6|24.0|
|9.0   |1.0 |
|-2.0  |NaN |
|NaN   |NaN |
+------+----+

Чтобы получить Array[(Double, Double)]

val result = df.rdd.map(row => (row.getDouble(0), row.getDouble(1))).collect()

Результат будет Array[(Double, Double)]

0 голосов
/ 24 апреля 2019
#Convert DataFrame to DataSet using case class & then convert it to list

#It'll return the list of type of your class object.All the variables inside the #class(mapping to fields in your table)will be pre-typeCasted) Then you won't need to #type cast every time.

#Please execute below code to check it-
#Sample to check & verify(scala)-

val wa = Array("one","two","two")
val wr = sc.parallelize(wa,3).map(x=>(x,"x",1))
val wdf = wr.toDF("a","b","c")
case class wc(a:String,b:String,c:Int)
val myList= wds.collect.toList
myList.foreach(x=>println(x))
myList.foreach(x=>println(x.a.getClass,x.b.getClass,x.c.getClass))

0 голосов
/ 24 апреля 2019
myDataFrame.select("_c1", "_c2").collect().map(each => (each.getAs[Double]("_c1"), each.getAs[Double]("_c2"))).toList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...