【问题标题】:Converting one Spark dataframe to another with a different schema将一个 Spark 数据帧转换为另一个具有不同架构的数据帧
【发布时间】:2015-08-24 18:22:45
【问题描述】:

我正在尝试将特定的 (py)spark 数据帧转换为另一个;原文有以下字段:

['ID', '事件', 'tstamp']

假设有 m 个不同的可能事件可以出现在“事件”列中,用“event_i”表示,i = 1,..m。我想创建一个新的数据框,其中包含以下字段:

['ID', 'event_1', 'event_2', 'event_3', ...'event_m'],

对于每个唯一 ID,我有每个发生的 m 个事件的计数。是否有一种仅使用 spark SQL API 的直接方法来执行此操作,而无需转换为 RDD 并返回?

我可以从头开始创建一个数据框,首先使用 m 个事件创建一个模式,按每个唯一 ID 进行过滤,然后使用 groupBy('event').count() 获取事件计数并从中手动创建行并将它们附加到数据框,但我只是觉得可能有一种更简单的方法可以做到这一点。我在 SO 上找不到类似的东西,但如果已经问过这个问题,我们深表歉意。

【问题讨论】:

    标签: python dataframe apache-spark-sql


    【解决方案1】:

    一种可能的解决方案是使用 .withColumn 方法和 UDF 来生成带有新列的新 DF,就像这样

    val myudf1 = udf((event: String) => if(event == "event_1") 1 else 0 )
    val myudf2 = udf((event: String) => if(event == "event_2") 1 else 0 )
    ....
    
    val countersDF = df.withColumn("event_1", myudf1(df("event")))
      .withColumn("event_2", myudf2(df("event")))
      .withColumn("event_3", myudf3(df("event")))
    ...
    

    显然你可以自动化更多我的代码,只是一个例子。 此时,您应该对您的 ID 进行分组并执行总和聚合。

    countersDF.groupBy("ID").agg(sum("event_1"), sum("event_2"), ...)
    

    【讨论】:

    • 啊哈,太聪明了!比迭代遍历每个唯一 ID 并创建行要好得多,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2023-02-02
    相关资源
    最近更新 更多