使用不同的模式将一个Spark数据帧转换为另一个

时间:2015-08-24 18:22:45

标签: python dataframe apache-spark-sql

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

['ID','event','tstamp']

假设有很多可能出现在'event'列中的事件,由'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上找不到这样的东西,但是如果已经被问过这个就道歉。

1 个答案:

答案 0 :(得分:0)

一个可能的解决方案可能是使用.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"), ...)