Конвертировать RDD Array [Array [String]] в DataFrame - PullRequest
0 голосов
/ 05 октября 2018

У меня есть набор данных в формате RDD, где каждая запись - Array[Array[String]].Каждая запись представляет собой массив пар key/value, и каждая запись может содержать не все возможные ключи.

Примером возможной записи является [[K1, V1], [K2, V2], [K3, V3], [K5, V5], [K7, V7]], а другой может быть [[K1, V1], [K3, V3], [K21, V21]].

* 1009.* Я надеюсь добиться перевода RDD в формат данных.K1, K2 и т. Д. Всегда представляют одинаковые String для каждой из строк (т. Е. K1 всегда «тип» и K2 всегда «цвет»), и я хочу использовать их какколонны.values V1, V2 и т. Д. Различаются по строкам, и я хочу использовать их для заполнения values для столбцов.

Я не уверен, как этого добиться,поэтому я был бы признателен за любую помощь / указатели.

1 Ответ

0 голосов
/ 06 октября 2018

Вы можете сделать что-то вроде,

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{Row, SparkSession}
import java.util.UUID
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types.StructType

    val l1: Array[Array[String]] = Array(
      Array[String]("K1", "V1"),
      Array[String]("K2", "V2"),
      Array[String]("K3", "V3"),
      Array[String]("K5", "V5"),
      Array[String]("K7", "V7"))

    val l2: Array[Array[String]] = Array(
      Array[String]("K1", "V1"),
      Array[String]("K3", "V3"),
      Array[String]("K21", "V21"))

    val spark = SparkSession.builder().master("local").getOrCreate()
    val sc = spark.sparkContext

    val rdd = sc.parallelize(Array(l1, l2)).flatMap(x => {
      val id = UUID.randomUUID().toString
      x.map(y => Row(id, y(0), y(1)))
    })

    val schema = new StructType()
      .add("id", "String")
      .add("key", "String")
      .add("value", "String")

    val df = spark
      .createDataFrame(rdd, schema)
      .groupBy("id")
      .pivot("key").agg(last("value"))
      .drop("id")

    df.printSchema()
    df.show(false)

Схема и выходные данные будут выглядеть примерно так:

root
 |-- K1: string (nullable = true)
 |-- K2: string (nullable = true)
 |-- K21: string (nullable = true)
 |-- K3: string (nullable = true)
 |-- K5: string (nullable = true)
 |-- K7: string (nullable = true)

+---+----+----+---+----+----+
|K1 |K2  |K21 |K3 |K5  |K7  |
+---+----+----+---+----+----+
|V1 |null|V21 |V3 |null|null|
|V1 |V2  |null|V3 |V5  |V7  |
+---+----+----+---+----+----+

Примечание: это приведет к null в пропущенных местах, как показано в выходных данных,pivot в основном транспонирует набор данных, основанный на некотором столбце. Надеюсь, это ответит на ваш вопрос!

...