【问题标题】:Pyspark, how to convert the raw data into SVMLight formatPyspark,如何将原始数据转换为 SVMLight 格式
【发布时间】:2021-07-21 01:46:14
【问题描述】:

我有一个关于 Pyspark 地图的问题。

例如,我有如下数据:

 data=[(1,1,1,10),(1,1,2,20),(2,1,3,15),(2,1,1,47),(3,0,2,28),(3,0,3,17)]
 df=spark.createDataFrame(data).toDF("ID","Target","features","value1")
 df.show()

 +---+------+--------+------+
 | ID|Target|features|value1|
 +---+------+--------+------+
 |  1|     1|       1|    10|
 |  1|     1|       2|    20|
 |  2|     1|       3|    15|
 |  2|     0|       1|    47|
 |  3|     0|       2|    28|
 |  3|     0|       3|    17|
 +---+------+--------+------+

我想将数据转换为:按 ID 分组:

 1 1:10  2:20
 1 2:15  1:47
 0 2:28  3:17

所以每一行代表ID,第一个值代表Target,features:value1

您能否提供任何示例代码或建议?

非常感谢!!!!!!!!!!!!

【问题讨论】:

    标签: dataframe pyspark format bigdata rdd


    【解决方案1】:

    您可以按ID(也可以按Target?)、collect 将数据分组到一个列表中,然后使用transformconcat_ws 的组合将每个列表格式化为所需格式:

    from pyspark.sql import functions as F
    
    df = spark.createDataFrame(data).toDF("ID","Target","features","value1") \
        .groupBy("ID", "Target").agg(F.collect_list(F.struct("features", "value1")).alias("feature_value")) \
        .withColumn("feature_value", F.expr("transform(feature_value, x -> concat_ws(':',x.features, x.value1))")) \
        .withColumn("feature_value", F.concat_ws(" ", F.col("feature_value"))) \
        .withColumn("result", F.concat_ws(" ", F.col("Target"), F.col("feature_value"))) \
        .select("result")
    

    结果:

    +-----------+
    |     result|
    +-----------+
    |0 2:28 3:17|
    |1 1:10 2:20|
    |1 3:15 1:47|
    +-----------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 2014-04-25
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多