我正在尝试将特定(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上找不到这样的东西,但是如果已经被问过这个就道歉。
答案 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"), ...)