Как вернуть подмножество столбцов DataFrame на основе dtypes столбцов в Spark Scala - PullRequest
0 голосов
/ 25 сентября 2019

Мне нужно разделить мой набор данных на разные подмножества на основе типов данных.

В Pandas мы можем сделать это с помощью df.select_dtypes, я хочу реализовать это в Spark Scala.Может кто-нибудь, пожалуйста, помогите.

Например, ниже мой набор данных: Набор данных

Я хочу разделить набор данных на основе типов данных на Float и String.

Мой конечный вывод должен быть примерно таким, с двумя разными фреймами данных с одинаковыми типами данных. Подмножество Dataframe только с плавающими значениями

Подмножество Dataframe только с строковыми значениями

**** Примечание: 1) У нас уже естьПакет Pandas в PySpark, но я хочу реализовать в Spark Scala.2) Если вы также можете помочь в том, как разделить столбцы с различными типами данных DATE, это будет действительно полезно ****

Любая помощь приветствуется, спасибо

Ниже приведен мой код, где яЯ пытаюсь разделить строки, числа и даты на разные фреймы данных на основе их типов данных:

+---+------+----------+---+----------+------+-------+
|Sno|  Name|       DOB|age|     jdate|Salary|Country|
+---+------+----------+---+----------+------+-------+
|  1|Charan|1995-03-13| 23|2017-08-23| 34873|     CA|
|  2| Arjun|1996-03-23| 33|2016-08-23| 36777|    USA|
|  3|   Ram|1994-06-13| 19|2012-12-12| 24873|     UK|
|  4|  Ravi|1997-04-13| 30|2019-08-23| 97853|     CA|
|  5| Indra|1999-03-13| 23|2000-08-23| 64773|    USA|
|  6| Rajni|1993-03-13| 23|2017-09-23| 67873|     UK|
+---+------+----------+---+----------+------+-------+
val data = sc.textFile("test.txt")
val header = data.first()
val datawh = data.filter(x => x != header)
case class Data(Sno:Integer, Name:String, DOB:String, age:Integer, jdate:String, Salary:Int, Country:String )
val idata = datawh.map(rec => { var d = rec.split('|');
(d(0).toInt,d(1).toString, d(2).toString, d(3).toInt, d(4).toString,d(5).toInt, d(6).toString)
})
var dataDF = idata.map(x => Data(x._1, x._2, x._3, x._4, x._5, x._6, x._7)).toDF()

Какой код должен быть записан под этим, чтобы разделить данные столбца на отдельные наборы данных или фреймы данных на основе типов данных.

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Есть эта функция dtypes, которая может помочь, например:

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

//df is the DataFrame containing the input data
df.dtypes.groupBy(_._2).map { case (k, v) =>
  (k, df.select(v.map { x => col(x._1) }: _*))
} // Returns Map[String, DataFrame] where key -> DataType and value -> subset Dataset
1 голос
/ 25 сентября 2019
import org.apache.spark.sql.functions._

val fieldsByDataType: Map[DataType, Array[Column]] = ds.schema.fields.groupBy(filed => filed.dataType)
      .mapValues(fields => fields.map(field => col(field.name)))

for ((dataType, columns) <- fieldsByDataType) {
  println(s"Dataset for $dataType")
  ds.select(columns:_*).show()
}

Пример:

val ds = Seq(
      ("dep1", "M", 1200, 34),
      ("dep1", "M", 800, 30),
      ("dep1", "F", 200, 21),
      ("dep2", "M", 1000, 21),
      ("dep2", "M", 1200, 22),
      ("dep2", "F", 500, 24),
      ("dep2", "M", 600, 44)
    ).toDF("department", "gender", "salary", "age")

Dataset for StringType
+----------+------+
|department|gender|
+----------+------+
|      dep1|     M|
|      dep1|     M|
|      dep1|     F|
|      dep2|     M|
|      dep2|     M|
|      dep2|     F|
|      dep2|     M|
+----------+------+

Dataset for IntegerType
+------+---+
|salary|age|
+------+---+
|  1200| 34|
|   800| 30|
|   200| 21|
|  1000| 21|
|  1200| 22|
|   500| 24|
|   600| 44|
+------+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...