我正试图将特定(py)spark数据帧转换为另一个;原文有以下字段:
['ID', 'event', 'tstamp']
假设有m个不同的可能事件可以出现在'event'列中,用'event_i'表示,i = 1,…m。我想创建一个新的数据框架,包含以下字段:
[‘身份证’,‘event_1’,‘event_2’,‘event_3’,……' event_m '],
,其中对于每个唯一ID,我有发生的m个事件中的每个事件的计数。是否有一种简单的方法来做到这一点,只使用spark SQL API,不需要转换到rdd和返回?
我可以从头开始创建一个数据框架,首先创建一个具有m事件的模式,按每个唯一ID过滤,然后使用groupBy('event').count()来获取事件计数,并从中手动创建行,并将它们附加到数据框架,但我只是得到这种感觉,可能有一种更简单的方法来做到这一点..我找不到这样的东西,但如果这已经被要求,请道歉。
一种可能的解决方案是使用.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"), ...)