将一个Spark数据帧转换为另一个具有不同架构的数据帧

2024-09-29 19:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

其中,对于每个唯一的ID,我有发生的每个m事件的计数。有没有一种简单明了的方法可以只使用sparksqlapi来实现这一点,而不需要转换成rdd再转换回来?在

我可以从头开始创建一个dataframe,方法是首先用m events创建一个模式,按每个惟一的ID进行筛选,然后使用groupBy('event').count()获取事件计数,并从中手动创建行并将其附加到dataframe中,但我只是觉得可能有更简单的方法来做这件事…我找不到任何类似的东西,但如果有人问过我,我道歉。在


Tags: 数据方法pyeventiddataframe原始数据模式
1条回答
网友
1楼 · 发布于 2024-09-29 19:32:53

一个可能的解决方案是使用.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进行分组并执行sum聚合。在

^{pr2}$

相关问题 更多 >

    热门问题