使用查找表为scala中的列值指定布尔值

rjee0c15  于 2021-07-13  发布在  Spark
关注(0)|答案(1)|浏览(233)

这是在scala spark环境中。
我有一个有列的数据框 paths 值的格式为: [page1,page2,page3,page4,page5] 我还有一个数据框,可以将这些页面Map到它们的 parent_page :
例子:
pageparent Page1家长\u Page1家长\u page2
每个页面只能与一个父级关联,但一个父级可以与多个页面关联。
首先,我想为原始Dataframe上的每个父页追加一列。然后我要循环遍历每行中的路径,对于每一页,根据父页的路径中是否有子页,使用1或0填充其父页列。
输出示例:
路径父级\u 1父级\u 2父级\u 3[第1页,第2页,第3页]111[第1页,第2页,第4页]110
我的大部分编程经验都是在r中,但是为了协作的目的,我需要将其保存在scala框架中。任何帮助都将不胜感激。

ahy6op9u

ahy6op9u1#

你可以做一个左连接,然后旋转 parent_pages :

val pathDF = Seq(
  (Array("page1", "page2", "page3")),
  (Array("page1", "page2", "page4"))
).toDF("path")

val pathParentDF = Seq(
  ("page1", "parent_1"),
  ("page2", "parent_2"),
  ("page3", "parent_3"),
  ("page4", "parent_4")
).toDF("page", "parent_page")

val result = pathDF
  .join(pathParentDF, array_contains(col("path"), col("page")), "left")
  .groupBy("path")
  .pivot("parent_page")
  .agg(first(lit(1)))

result.show(false)

//+---------------------+--------+--------+--------+--------+
//|path                 |parent_1|parent_2|parent_3|parent_4|
//+---------------------+--------+--------+--------+--------+
//|[page1, page2, page3]|1       |1       |1       |null    |
//|[page1, page2, page4]|1       |1       |null    |1       |
//+---------------------+--------+--------+--------+--------+

相关问题