【问题标题】:How to add a new column to data frame based on two columns of other data frames如何根据其他数据框的两列向数据框添加新列
【发布时间】:2019-01-14 00:58:03
【问题描述】:

我有两个 DataFrame df_datadf_node_labels

df_data =

    nodeId   field1
    1        abc
    2        def
    3        fed
    4        kfl

df_node_labels =
    srcId   srcLabel    dstId    dstLabel
    1       AAA         2        BBB
    2       BBB         4        FFF
    4       FFF         3        CCC

我想在df_data 中添加一列labellabel的值应该取自srcLabeldstLabel

这就是我尝试获取标签信息的方式:

var df = df_data.join(df_node_labels.select("srcId","srcLabel"),col("nodeId")===col("srcId"),"left")
df = df.join(df_node_labels.select("dstId","dstLabel"),col("nodeId")===col("dstId"),"left")

但是,这会在 df 中创建两列 srcLabeldstLabel,而我只想得到一列 label

这是预期的结果:

df =
        nodeId   field1   label
        1        abc      AAA
        2        def      BBB
        3        fed      CCC
        4        kfl      FFF

更新:

我可以这样做,但在我看来,做一件简单的事情还有很长的路要走:

df = df.withColumn("label", when(col("srcLabel") =!= "", col("srcLabel")).otherwise(col("dstLabel"))).drop("srcLabel").drop("dstLabel")

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您可以从df_node_labels 创建一个唯一数据作为下面的finalDF 并执行join 操作,这将为您提供预期的结果。

    val finalDF = df_node_labels.select($"srcId".as("nodeId"), $"srcLabel".as("label"))
      .union(
        df_node_labels.select($"dstId".as("nodeId"), $"dstLabel".as("label"))
      ).dropDuplicates()
    
    
    df_data.join(finalDF, Seq("nodeId"), "left")
      .show(false)
    

    输出:

    +------+------+-----+
    |nodeId|field1|label|
    +------+------+-----+
    |1     |abc   |AAA  |
    |2     |def   |BBB  |
    |3     |fed   |CCC  |
    |4     |kfl   |FFF  |
    +------+------+-----+
    

    希望对你有所帮助!

    【讨论】:

    • 有趣的是,节点标签数据框表明,如果节点是 srcdst,它可能具有不同的标签。否则,这种结构就没有意义了。
    • @MichelLemay:你什么意思?问题是nodeId并不总是属于srcId,也应该在dstId列中搜索。
    • 我注意到您有 (srcId, srcLabel) 和 (dstId, dstLabel) 可能在 srcId 和 dstId 之间共享 nodeId。因此,如果您对同一 nodeId 有不同的标签,则执行联合并删除重复项(如答案中所示)可能会引入问题。
    • @MichelLemay:但如果srcIddstId 相同,srcLabel 总是对应于dstLabel
    • @ScalaBoy 是的,但数据结构允许否则,恕我直言,这可能是一个糟糕的设计。如果您有其他顶点(节点)元数据怎么办?在不断发展的大型数据表中保持同步肯定会变得很痛苦。
    猜你喜欢
    • 2019-04-04
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多