如果列在连接后不为空,则分组并收集集

时间:2018-06-07 13:38:33

标签: scala apache-spark dataframe

我有一张桌子和3本词典。字典每个只有一列。表的结构是

time:string, ctn:string, url:string

加入后我得到一个6列的df

tableDF
.join(enq2, $"url".contains($"q2"), "left_outer")
.join(enq3, $"url".contains($"q3"), "left_outer")
.join(model, $"url".contains($"model"), "left_outer")

我需要的是表格中的3列,如果q2, q3, and model不为空,则需要一组model。或者,如果q2, q3 or model中的任何一个为空,则为空集。

所以我分组

.groupBy($"url", $"ctn", $"timestamp")

并尝试获取设置

.withColumn("model",
when($"q2".isNotNull && $"q3".isNotNull && $"model".isNotNull, collect_set($"model")
).otherwise())

哪个不起作用

我也试过

.agg(get_set($"q2", $"q3", $"model").alias("model"))

其中get_set看起来有点像

def get_set(q2: ColumnName, q3: ColumnName, model: ColumnName):Column={
if(q2.isNotNull && q3.isNotNull && model.isNotNull)
  collect_set(model)
}

isNotNull返回Column,我需要boolean。我不确定==null是否正确。或者我可能应该将列转换为字符串并检查它。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您应该执行以下操作

    <!-- Card deck -->
                <div class="card-deck">
                    <!-- Card -->
                    <div class="col-md-6 col-lg-4 col-xl-3">
                        <div class="card mb-4">
                            <!--Card image-->
                            <div class="view overlay"><img alt="Work eyewear" class="card-img-top img-fluid" src="img/clothing-1.jpg"></div><!--Card content-->
                            <div class="card-body">
                                <!--Title-->
                                <h4 class="card-title">PPE</h4><!--Text-->
                                <p class="card-text">PPE is equipment that will protect the user against health or safety risks at work...</p><!-- Provides extra visual weight and identifies the primary action in a set of buttons -->
                                <a class="" href="https://shop.spartansafety.co.uk/personal-protection-s/1820.htm">SHOP NOW <i class="fas fa-arrow-right fa-xs"></i></a>
                            </div>
                        </div>
                    </div><!-- Card -->

或者你只能.groupBy($"url", $"ctn", $"timestamp").agg(collect_set(when($"q2".isNotNull && $"q3".isNotNull && $"model".isNotNull, $"model").otherwise(lit(null)))) 这些空行

drop