使用Scala在Spark中声明数百个特征

我有一个如下结构的超大表格:

user, product, actionuser1, productA, actionAuser1, productA, actionBuser1, productA, actionBuser2, productF, actionAuser3, productZ, actionC

我想将其转换为以下形式:

阶段1:检索特定产品的特定行为

user, productA_actionA, productB_actionA, …, productA_actionB, productB_actionB…user1, 1, 0, ..., 0,0, ...user1, 0, 0, ..., 1,0, ...user1, 0, 0, ..., 1,0, ...user2, 0, 0, ..., 0,0, ...

我有一个包含特定组合的数组:

[(productA,actionA) ,(productB,actionA) ,… ,(productA,actionB) ,(productB,actionB) …]

阶段2:按用户分组,并对其产品和行为进行求和

user, productA_actionA, productB_actionA, …, productA_actionB, productB_actionB…user1, 1, 0, ..., **2**,0, ...user2, 0, 0, ..., 0,0, ...

我尝试对每个特征使用withColumn function,但这花费了很长时间:

for ( (productID,productAction) <- productsCombination ) {    newTable = newTable.withColumn("Product_"+productID+"_"+productAction, when(col("product_action_id") === productAction and col("product_id") === productID, $"product_count").otherwise(0))

这里有一个示例展示我想做的事情:

示例

有什么建议吗?


回答:

我没有完全理解这个问题,但根据你的截图进行了考虑。就像T. Gawęda所说,你应该使用Pivot。请注意,pivot 仅在Spark 1.6+版本可用。

假设这是你的源DataFrame

scala> df.show()+-----+-------+---------------+| User|Product|         Action|+-----+-------+---------------+|user1|      A|         Viewed||user1|      A|         Viewed||user1|      A|         Viewed||user1|      C|      AddToCart||user1|      A|RemovedFromCart||user2|      B|         Viewed||user2|      B|         Viewed||user3|      A|         Viewed||user3|      A|      AddToCart||user4|      B|      AddToCart||user5|      A|         Viewed|+-----+-------+---------------+

现在,由于你需要对两列进行Pivot,你可以使用Apache Spark提供的concat_ws函数将它们连接成一列,然后对连接后的列进行Pivot,按Users进行groupBy,并使用count作为Products的聚合函数。

df.withColumn("combined", concat_ws("_", $"Product", $"Action"))  .groupBy("User")  .pivot("combined")  .agg(count($"Product")).show()+-----+-----------+-----------------+--------+-----------+--------+-----------+| User|A_AddToCart|A_RemovedFromCart|A_Viewed|B_AddToCart|B_Viewed|C_AddToCart|+-----+-----------+-----------------+--------+-----------+--------+-----------+|user1|          0|                1|       3|          0|       0|          1||user2|          0|                0|       0|          0|       2|          0||user3|          1|                0|       1|          0|       0|          0||user4|          0|                0|       0|          1|       0|          0||user5|          0|                0|       1|          0|       0|          0|+-----+-----------+-----------------+--------+-----------+--------+-----------+

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注