データフレームを固定列数にピボットしますsparksql

ラオ

私はデータフレームを持っています

val df = spark.sqlContext.createDataFrame(Seq( ("100","3","sceince","A"), ("100","3","maths","B"), ("100","3","maths","F"), ("100","3","computesrs","null"), ("101","2","maths","E"), ("101","2","computesrs","C"), ("102","2","maths","null"), ("102","2","computesrs","C"),  ("100","2","maths","D"), ("100","2","computesrs","C") )).toDF("Rid","class","subject","teacher")

scala> df.show
+---+-------+----------+-------+
|Rid|class  |   subject|teacher|
+---+-------+----------+-------+
|100|      3|   sceince|      A|
|100|      3|     maths|      B|
|100|      3|     maths|      F|
|100|      3|computesrs|   null|
|101|      2|     maths|      E|
|101|      2|computesrs|      C|
|102|      2|     maths|   null|
|102|      2|computesrs|      C|
|100|      2|     maths|      D|
|100|      2|computesrs|      C|
+---+-------+----------+-------+

このデータフレームを、BYとをグループ化するいくつかの(5)固定列にピボットする必要がRidありclassます。ここではsubject、カラムはなく、あたり、nは全く異なる値の持たないかもしれないRidclass、私たちは生成する必要がsubjectteacherキーと値のペアとしての列が。

予想されるデータフレーム:

    +-------+-------+-----------+---------------+---------------+---------------+-----------+---------------+---------------+---------------+--------+--------------+
    |Rid    |class  |period1    |periodteacher1 |period2        |periodteacher2 |period3    |periodteacher3 |period4        |periodteacher4 |period5 |periodteacher5|
    +-------+-------+-----------+---------------+---------------+---------------+-----------+---------------+---------------+---------------+--------+--------------+
    |100    |3      |sceince    |A              |maths          |B              |maths      |F              |computesrs     |               |        |              |
    |100    |2      |maths      |D              |computesrs     |C              |           |               |               |               |        |              |
    |101    |2      |maths      |E              |computesrs     |C              |           |               |               |               |        |              |
    |102    |2      |maths      |               |computesrs     |C              |           |               |               |               |        |              |
    +-------+-------+-----------+---------------+---------------+---------------+-----------+---------------+---------------+---------------+--------+--------------+

助言がありますか ?

サラスチャンドラベマ

ランク付けしてからピボットを適用する必要があります。コードについては以下を参照してください

scala> import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.expressions.Window

scala> import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions._
scala> val df = Seq((100,3,"sceince","A"), (100,3,"maths","B"), (100,3,"maths","F"), (100,3,"computesrs",null), (101,2,"maths","E"), (101,2,"computesrs","C"), (102,2,"maths",null), (102,2,"computesrs","C"), (100,2,"maths","D"), (100,2,"computesrs","C")).toDF("Rid", "class", "subject", "teacher")
df: org.apache.spark.sql.DataFrame = [Rid: int, class: int ... 2 more fields]

scala> df.show
+---+-----+----------+-------+
|Rid|class|   subject|teacher|
+---+-----+----------+-------+
|100|    3|   sceince|      A|
|100|    3|     maths|      B|
|100|    3|     maths|      F|
|100|    3|computesrs|   null|
|101|    2|     maths|      E|
|101|    2|computesrs|      C|
|102|    2|     maths|   null|
|102|    2|computesrs|      C|
|100|    2|     maths|      D|
|100|    2|computesrs|      C|
+---+-----+----------+-------+

ランキング用のウィンドウ関数の作成

scala> val wind2 = Window.partitionBy("Rid", "class").orderBy("subject")
wind2: org.apache.spark.sql.expressions.WindowSpec = org.apache.spark.sql.expressions.WindowSpec@6e13e2fc

scala> val resDF = df.withColumn("rank", row_number().over(wind2))
resDF: org.apache.spark.sql.DataFrame = [Rid: int, class: int ... 3 more fields]

scala> resDF.show
+---+-----+----------+-------+----+
|Rid|class|   subject|teacher|rank|
+---+-----+----------+-------+----+
|102|    2|computesrs|      C|   1|
|102|    2|     maths|   null|   2|
|101|    2|computesrs|      C|   1|
|101|    2|     maths|      E|   2|
|100|    2|computesrs|      C|   1|
|100|    2|     maths|      D|   2|
|100|    3|computesrs|   null|   1|
|100|    3|     maths|      B|   2|
|100|    3|     maths|      F|   3|
|100|    3|   sceince|      A|   4|
+---+-----+----------+-------+----+

今すぐピボットを適用する

scala> resDF.groupBy("Rid", "class").pivot("rank", Seq("1", "2", "3", "4", "5")).agg(first($"subject"), first($"teacher")).show
+---+-----+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
|Rid|class|1_first(subject, false)|1_first(teacher, false)|2_first(subject, false)|2_first(teacher, false)|3_first(subject, false)|3_first(teacher, false)|4_first(subject, false)|4_first(teacher, false)|5_first(subject, false)|5_first(teacher, false)|
+---+-----+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
|102|    2|                  maths|                   null|             computesrs|                      C|                   null|                   null|                   null|                   null|                   null|                   null|
|101|    2|                  maths|                      E|             computesrs|                      C|                   null|                   null|                   null|                   null|                   null|                   null|
|100|    2|                  maths|                      D|             computesrs|                      C|                   null|                   null|                   null|                   null|                   null|                   null|
|100|    3|                sceince|                      A|                  maths|                      B|                  maths|                      F|             computesrs|                   null|                   null|                   null|
+---+-----+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+

を使用して列の名前を変更します .withColumnRenamed(<existingName>, <newName>)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

列(ID)ごとにデータフレームをピボットします

分類Dev

Pythonデータフレームで複数の列を行に変換/ピボット解除します

分類Dev

パンダ:データフレームをピボットし、追加の非数値列を保持します

分類Dev

csvからデータをピボットし、データフレームに保存します

分類Dev

SparkSQLはデータセットをデータフレームに変換します

分類Dev

groupBy列なしでSparkデータフレームをピボットする

分類Dev

データフレームの値を列に「ピボット」する方法

分類Dev

複数の列を使用してPandasデータフレームをピボットする

分類Dev

pysparkデータフレームがjson列を新しい列にピボットする

分類Dev

パンダは、列が等しくないデータフレームをピボットします

分類Dev

deedleデータフレームのピボットを解除します

分類Dev

ピボットされたデータフレームに終了列を追加する方法はありますか?

分類Dev

パンダは複数のgroupbyでデータフレームをピボットします

分類Dev

データフレーム列をコンマとピボットで解析します-python

分類Dev

value_counts()を使用したgroupby結果の後にデータフレームをピボットします

分類Dev

ピボットを使用してデータフレームを目的の形式に並べ替えます

分類Dev

開始日と終了日のデータフレームを真理値表にピボットします

分類Dev

パンダは、値が2つの列の関数であるデータフレームをピボットします

分類Dev

選択した列に基づいてパンダのデータフレームをピボットします

分類Dev

列をタイトルにピボットする方法は?-python pandasデータフレーム

分類Dev

2列のデータフレームをピボットする

分類Dev

pandasデータフレームの特定の列をピボットする

分類Dev

Sparkデータフレームの複数の列をピボットする方法は?

分類Dev

tidyr ::ピボット_longerを使用して1行のデータフレームを変換する:列のペアを取得してスタックします

分類Dev

複数の列をインデックスとして使用してdaskデータフレームをピボットする

分類Dev

データフレームのリストをピボットしてマージします

分類Dev

データフレームを再構築して(おそらくピボットまたはアンピボット)、各列に0と1に基づいてデータのラベルを表示させます

分類Dev

(Python / Pandas)条件に基づいてピボットされたデータフレームの2つの列を分割します

分類Dev

データフレームをピボットして複数の行を1つに折りたたむ方法

Related 関連記事

  1. 1

    列(ID)ごとにデータフレームをピボットします

  2. 2

    Pythonデータフレームで複数の列を行に変換/ピボット解除します

  3. 3

    パンダ:データフレームをピボットし、追加の非数値列を保持します

  4. 4

    csvからデータをピボットし、データフレームに保存します

  5. 5

    SparkSQLはデータセットをデータフレームに変換します

  6. 6

    groupBy列なしでSparkデータフレームをピボットする

  7. 7

    データフレームの値を列に「ピボット」する方法

  8. 8

    複数の列を使用してPandasデータフレームをピボットする

  9. 9

    pysparkデータフレームがjson列を新しい列にピボットする

  10. 10

    パンダは、列が等しくないデータフレームをピボットします

  11. 11

    deedleデータフレームのピボットを解除します

  12. 12

    ピボットされたデータフレームに終了列を追加する方法はありますか?

  13. 13

    パンダは複数のgroupbyでデータフレームをピボットします

  14. 14

    データフレーム列をコンマとピボットで解析します-python

  15. 15

    value_counts()を使用したgroupby結果の後にデータフレームをピボットします

  16. 16

    ピボットを使用してデータフレームを目的の形式に並べ替えます

  17. 17

    開始日と終了日のデータフレームを真理値表にピボットします

  18. 18

    パンダは、値が2つの列の関数であるデータフレームをピボットします

  19. 19

    選択した列に基づいてパンダのデータフレームをピボットします

  20. 20

    列をタイトルにピボットする方法は?-python pandasデータフレーム

  21. 21

    2列のデータフレームをピボットする

  22. 22

    pandasデータフレームの特定の列をピボットする

  23. 23

    Sparkデータフレームの複数の列をピボットする方法は?

  24. 24

    tidyr ::ピボット_longerを使用して1行のデータフレームを変換する:列のペアを取得してスタックします

  25. 25

    複数の列をインデックスとして使用してdaskデータフレームをピボットする

  26. 26

    データフレームのリストをピボットしてマージします

  27. 27

    データフレームを再構築して(おそらくピボットまたはアンピボット)、各列に0と1に基づいてデータのラベルを表示させます

  28. 28

    (Python / Pandas)条件に基づいてピボットされたデータフレームの2つの列を分割します

  29. 29

    データフレームをピボットして複数の行を1つに折りたたむ方法

ホットタグ

アーカイブ