Как создать Dataframe из существующего Dataframe и сделать определенные поля типом Struct? - PullRequest
3 голосов
/ 02 апреля 2019

Мне нужно создать DataFrame из существующего DataFrame, в котором мне нужно также изменить схему.

У меня есть DataFrame вроде:

+-----------+----------+-------------+
|Id         |Position   |playerName  |
+-----------+-----------+------------+
|10125      |Forward    |Messi       |
|10126      |Forward    |Ronaldo     |
|10127      |Midfield   |Xavi        |
|10128      |Midfield   |Neymar      |

, и я создан с помощьюкласс кейса, приведенный ниже:

case class caseClass (
                       Id: Int = "",
                       Position : String = "" ,
                       playerName : String = "" 
                     )

Теперь мне нужно сделать Имя игрока и Позиция в типе Структуры.

т.е.

Мне нужно создать еще один DataFrame со схемой,

root

| - Id: int (nullable = true)

| - playerDetails: struct (nullable = true)

|| --playername: строка (nullable = true)

|| --Position: string (nullable = true)

Я сделал следующий код, чтобы создать новый фрейм данных, ссылаясь на ссылку https://medium.com/@mrpowers/adding-structtype-columns-to-spark-dataframes-b44125409803

myschema is

  List(
    StructField("Id", IntegerType, true),
    StructField("Position",StringType, true),
    StructField("playerName", StringType,true)
)

Я попробовал следующий код

  spark.sparkContext.parallelize(data),
  myschema
)

, но не могу этого сделать.

Я видел похожий вопрос Изменить схему существующего фрейма данных , но яне могу понять решение.

Есть ли какое-либо решение для непосредственной реализации StructType внутри класса case?так что я думаю, что мне не нужно создавать собственную схему для создания значений типа структуры.

1 Ответ

1 голос
/ 02 апреля 2019

Можно использовать функцию "struct":

// data
val playersDF = Seq(
  (10125, "Forward", "Messi"),
  (10126, "Forward", "Ronaldo"),
  (10127, "Midfield", "Xavi"),
  (10128, "Midfield", "Neymar")
).toDF("Id", "Position", "playerName")

// action
val playersStructuredDF = playersDF.select($"Id", struct("playerName", "Position").as("playerDetails"))
// display
playersStructuredDF.printSchema()
playersStructuredDF.show(false)

Выход:

root
 |-- Id: integer (nullable = false)
 |-- playerDetails: struct (nullable = false)
 |    |-- playerName: string (nullable = true)
 |    |-- Position: string (nullable = true)

+-----+------------------+
|Id   |playerDetails     |
+-----+------------------+
|10125|[Messi, Forward]  |
|10126|[Ronaldo, Forward]|
|10127|[Xavi, Midfield]  |
|10128|[Neymar, Midfield]|
+-----+------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...