Spark DataFrame将多行转换为列

切除

我是一个新手,我想源数据帧(从JSON文件加载)下面进行转换

+--+-----+-----+
|A |count|major|
+--+-----+-----+
| a|    1|   m1|
| a|    1|   m2|
| a|    2|   m3|
| a|    3|   m4|
| b|    4|   m1|
| b|    1|   m2|
| b|    2|   m3|
| c|    3|   m1|
| c|    4|   m3|
| c|    5|   m4|
| d|    6|   m1|
| d|    1|   m2|
| d|    2|   m3|
| d|    3|   m4|
| d|    4|   m5|
| e|    4|   m1|
| e|    5|   m2|
| e|    1|   m3|
| e|    1|   m4|
| e|    1|   m5|
+--+-----+-----+

放入以下结果数据框

+--+--+--+--+--+--+
|A |m1|m2|m3|m4|m5|
+--+--+--+--+--+--+
| a| 1| 1| 2| 3| 0|
| b| 4| 2| 1| 0| 0|
| c| 3| 0| 4| 5| 0|
| d| 6| 1| 2| 3| 4|
| e| 4| 5| 1| 1| 1|
+--+--+--+--+--+--+

这是转换规则

  1. 结果数据帧由以下A + (n major columns)major列名称组成:

    sorted(src_df.map(lambda x: x[2]).distinct().collect())
    
  2. 结果数据帧包含m行,其中A的值由以下提供:

    sorted(src_df.map(lambda x: x[0]).distinct().collect())
    
  3. 在结果数据帧的每个主要列中的值是从源数据帧上的相应的值A和主要(例如中第1行中源数据帧计数被映射到box哪里Aa和列m1

  4. Amajor在源数据帧中的组合没有重复(请在SQL的两列中将其视为主键)

零323

让我们从示例数据开始:

df = sqlContext.createDataFrame([
    ("a", 1, "m1"), ("a", 1, "m2"), ("a", 2, "m3"),
    ("a", 3, "m4"), ("b", 4, "m1"), ("b", 1, "m2"),
    ("b", 2, "m3"), ("c", 3, "m1"), ("c", 4, "m3"),
    ("c", 5, "m4"), ("d", 6, "m1"), ("d", 1, "m2"),
    ("d", 2, "m3"), ("d", 3, "m4"), ("d", 4, "m5"),
    ("e", 4, "m1"), ("e", 5, "m2"), ("e", 1, "m3"),
    ("e", 1, "m4"), ("e", 1, "m5")], 
    ("a", "cnt", "major"))

请注意,我已更改countcntCount是大多数SQL方言中的保留关键字,对于列名而言,它不是一个好的选择。

至少有两种方法可以重塑此数据:

  • 在DataFrame上聚合

    from pyspark.sql.functions import col, when, max
    
    majors = sorted(df.select("major")
        .distinct()
        .map(lambda row: row[0])
        .collect())
    
    cols = [when(col("major") == m, col("cnt")).otherwise(None).alias(m) 
        for m in  majors]
    maxs = [max(col(m)).alias(m) for m in majors]
    
    reshaped1 = (df
        .select(col("a"), *cols)
        .groupBy("a")
        .agg(*maxs)
        .na.fill(0))
    
    reshaped1.show()
    
    ## +---+---+---+---+---+---+
    ## |  a| m1| m2| m3| m4| m5|
    ## +---+---+---+---+---+---+
    ## |  a|  1|  1|  2|  3|  0|
    ## |  b|  4|  1|  2|  0|  0|
    ## |  c|  3|  0|  4|  5|  0|
    ## |  d|  6|  1|  2|  3|  4|
    ## |  e|  4|  5|  1|  1|  1|
    ## +---+---+---+---+---+---+
    
  • groupBy 超过RDD

    from pyspark.sql import Row
    
    grouped = (df
        .map(lambda row: (row.a, (row.major, row.cnt)))
        .groupByKey())
    
    def make_row(kv):
        k, vs = kv
        tmp = dict(list(vs) + [("a", k)])
        return Row(**{k: tmp.get(k, 0) for k in ["a"] + majors})
    
    reshaped2 = sqlContext.createDataFrame(grouped.map(make_row))
    
    reshaped2.show()
    
    ## +---+---+---+---+---+---+
    ## |  a| m1| m2| m3| m4| m5|
    ## +---+---+---+---+---+---+
    ## |  a|  1|  1|  2|  3|  0|
    ## |  e|  4|  5|  1|  1|  1|
    ## |  c|  3|  0|  4|  5|  0|
    ## |  b|  4|  1|  2|  0|  0|
    ## |  d|  6|  1|  2|  3|  4|
    ## +---+---+---+---+---+---+
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Spark:将 DataFrame 列转换为向量

来自分类Dev

将Python字典转换为Spark DataFrame

来自分类Dev

如何将Spark Streaming数据转换为Spark DataFrame

来自分类Dev

通过将键作为列将JSON字典转换为Spark DataFrame

来自分类Dev

如何将稀疏向量的Spark DataFrame列转换为密集向量的列?

来自分类Dev

如何将 Pandas DataFrame 的 rdd 转换为 Spark DataFrame

来自分类Dev

Spark DataFrame将列值转换为字符串变量

来自分类Dev

如何将整数值的 Spark Dataframe 列转换为 HH:MM:SS?

来自分类Dev

如何将表转换为Spark Dataframe

来自分类Dev

将Spark Dataframe转换为Scala Map集合

来自分类Dev

pySpark将mapPartitions的结果转换为spark DataFrame

来自分类Dev

使用Spark / scala将String转换为DataFrame

来自分类Dev

Spark:如何将元组转换为DataFrame

来自分类Dev

Spark SQL-如何将RelationalGroupedDataSet转换为DataFrame

来自分类Dev

将Spark Java转换为Spark Scala

来自分类Dev

在Scala中将Spark的DataFrame列转换为List [String]

来自分类Dev

将字符串列转换为矢量列Spark DataFrames

来自分类Dev

将 spark Rdd 列转换为 Pyspark 中的行

来自分类Dev

scala spark 将结构类型列转换为 json 数据

来自分类Dev

使用spark Scala将行转换为列

来自分类Dev

将 Spark 数据框列的不同值转换为列表

来自分类Dev

Spark DataFrame将字符串格式的毫秒时间戳列转换为以毫秒为单位的人类可读时间

来自分类Dev

使用Scala将转换后的列附加到Spark DataFrame

来自分类Dev

使用Scala将org.apache.spark.mllib.linalg.Vector RDD转换为Spark中的DataFrame

来自分类Dev

Spark 将列值拆分为多行

来自分类Dev

在Spark / Scala中将RDD转换为Dataframe

来自分类Dev

在Spark Scala中将DataFrame转换为HDFS

来自分类Dev

在scala中将Spark Dataframe转换为RDD

来自分类Dev

Spark Scala:如何将Dataframe [vector]转换为DataFrame [f1:Double,...,fn:Double)]

Related 相关文章

  1. 1

    Spark:将 DataFrame 列转换为向量

  2. 2

    将Python字典转换为Spark DataFrame

  3. 3

    如何将Spark Streaming数据转换为Spark DataFrame

  4. 4

    通过将键作为列将JSON字典转换为Spark DataFrame

  5. 5

    如何将稀疏向量的Spark DataFrame列转换为密集向量的列?

  6. 6

    如何将 Pandas DataFrame 的 rdd 转换为 Spark DataFrame

  7. 7

    Spark DataFrame将列值转换为字符串变量

  8. 8

    如何将整数值的 Spark Dataframe 列转换为 HH:MM:SS?

  9. 9

    如何将表转换为Spark Dataframe

  10. 10

    将Spark Dataframe转换为Scala Map集合

  11. 11

    pySpark将mapPartitions的结果转换为spark DataFrame

  12. 12

    使用Spark / scala将String转换为DataFrame

  13. 13

    Spark:如何将元组转换为DataFrame

  14. 14

    Spark SQL-如何将RelationalGroupedDataSet转换为DataFrame

  15. 15

    将Spark Java转换为Spark Scala

  16. 16

    在Scala中将Spark的DataFrame列转换为List [String]

  17. 17

    将字符串列转换为矢量列Spark DataFrames

  18. 18

    将 spark Rdd 列转换为 Pyspark 中的行

  19. 19

    scala spark 将结构类型列转换为 json 数据

  20. 20

    使用spark Scala将行转换为列

  21. 21

    将 Spark 数据框列的不同值转换为列表

  22. 22

    Spark DataFrame将字符串格式的毫秒时间戳列转换为以毫秒为单位的人类可读时间

  23. 23

    使用Scala将转换后的列附加到Spark DataFrame

  24. 24

    使用Scala将org.apache.spark.mllib.linalg.Vector RDD转换为Spark中的DataFrame

  25. 25

    Spark 将列值拆分为多行

  26. 26

    在Spark / Scala中将RDD转换为Dataframe

  27. 27

    在Spark Scala中将DataFrame转换为HDFS

  28. 28

    在scala中将Spark Dataframe转换为RDD

  29. 29

    Spark Scala:如何将Dataframe [vector]转换为DataFrame [f1:Double,...,fn:Double)]

热门标签

归档